{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Chapter 3 – Classification**\n",
    "\n",
    "_This notebook contains all the sample code and solutions to the exercises in chapter 3._"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Setup"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, let's make sure this notebook works well in both python 2 and 3, import a few common modules, ensure MatplotLib plots figures inline and prepare a function to save the figures:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# To support both python 2 and python 3\n",
    "from __future__ import division, print_function, unicode_literals\n",
    "\n",
    "# Common imports\n",
    "import numpy as np\n",
    "import os\n",
    "\n",
    "# to make this notebook's output stable across runs\n",
    "np.random.seed(42)\n",
    "\n",
    "# To plot pretty figures\n",
    "%matplotlib inline\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams['axes.labelsize'] = 14\n",
    "plt.rcParams['xtick.labelsize'] = 12\n",
    "plt.rcParams['ytick.labelsize'] = 12\n",
    "\n",
    "# Where to save the figures\n",
    "PROJECT_ROOT_DIR = \".\"\n",
    "CHAPTER_ID = \"classification\"\n",
    "\n",
    "def save_fig(fig_id, tight_layout=True):\n",
    "    path = os.path.join(PROJECT_ROOT_DIR, \"images\", CHAPTER_ID, fig_id + \".png\")\n",
    "    print(\"Saving figure\", fig_id)\n",
    "    if tight_layout:\n",
    "        plt.tight_layout()\n",
    "    plt.savefig(path, format='png', dpi=300)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# MNIST"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'COL_NAMES': ['label', 'data'],\n",
       " 'DESCR': 'mldata.org dataset: mnist-original',\n",
       " 'data': array([[0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        ..., \n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0]], dtype=uint8),\n",
       " 'target': array([ 0.,  0.,  0., ...,  9.,  9.,  9.])}"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.datasets import fetch_mldata\n",
    "mnist = fetch_mldata('MNIST original')\n",
    "mnist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000, 784)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X, y = mnist[\"data\"], mnist[\"target\"]\n",
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000,)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "784"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "28*28"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure some_digit_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fef28a98240>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "some_digit = X[36000]\n",
    "some_digit_image = some_digit.reshape(28, 28)\n",
    "plt.imshow(some_digit_image, cmap = matplotlib.cm.binary,\n",
    "           interpolation=\"nearest\")\n",
    "plt.axis(\"off\")\n",
    "\n",
    "save_fig(\"some_digit_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def plot_digit(data):\n",
    "    image = data.reshape(28, 28)\n",
    "    plt.imshow(image, cmap = matplotlib.cm.binary,\n",
    "               interpolation=\"nearest\")\n",
    "    plt.axis(\"off\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# EXTRA\n",
    "def plot_digits(instances, images_per_row=10, **options):\n",
    "    size = 28\n",
    "    images_per_row = min(len(instances), images_per_row)\n",
    "    images = [instance.reshape(size,size) for instance in instances]\n",
    "    n_rows = (len(instances) - 1) // images_per_row + 1\n",
    "    row_images = []\n",
    "    n_empty = n_rows * images_per_row - len(instances)\n",
    "    images.append(np.zeros((size, size * n_empty)))\n",
    "    for row in range(n_rows):\n",
    "        rimages = images[row * images_per_row : (row + 1) * images_per_row]\n",
    "        row_images.append(np.concatenate(rimages, axis=1))\n",
    "    image = np.concatenate(row_images, axis=0)\n",
    "    plt.imshow(image, cmap = matplotlib.cm.binary, **options)\n",
    "    plt.axis(\"off\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure more_digits_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nkSQOGTIEgNlnnx2Afffdt5LDsSoxcuRIAC6++GIAnnrqKQA++OADAJZaaqmKjMsM4OWXXwagV69e\nANx1110AbLLJJhUbU5yTRDMzMzNLcJLYRFOmTAFgwIABAAwdOhSAvffeO3OdCy64AID55psv5dE1\nbI455kicd+qppwKhZm3rrbdOc0ipuf/++wHo06dP1vmjR48GqmsPrpT++eefgs6rVf369QNg7bXX\nBlpmknjJJZcAcN999wHw5JNPVnI4FfX0008DsOeeewLw888/AzDTTDNVbEzFGjhwIABnnXUWEFJQ\ngPXWW68SQ6q4H374AYB27doB0L17dwDuvPPOzHWWXHLJ9AfWRCeeeCIA33//fYVHkp+TRDMzMzNL\ncJJYJO2lay/v7bffBqB169YAfPPNN5nrtmrVKuXRFaaa91rKTY89niioNqRek8Rx48YlzltwwQUr\nMJLyevPNN7P+BejcuXOlhpOK9957D4BBgwYB2duglurTTz8FQoJYS+69914gJIjaVr377ruZ67S0\nJHG77bYD4NVXX806X9u1a665JnPe2Wefnd7Amumdd96p9BAa5STRzMzMzBKcJBZo6tSpADzwwANA\nSBBl2223BeCWW25Jd2BN8Pjjj1d6CBVz7bXXVnoIFTF27NjEeT179qzASMrrxx9/BOCnn36q8EjS\n8+KLLwIhQVx22WUrOZyKOfLIIzOn822H9Z6ff/75UxlTU3z11VdAsma4nmqIIdSHT58+PXHZlltu\nCYQjdw8++CAAf/zxR87b0uce4P333wdgmWWWyfq/6HwrjJNEMzMzM0vwj0QzMzMzS/Dh5gZ8/vnn\nmdOKv9WMWG1kzj//fAB22WWXlEfXdPH4vSX47rvvgJY7aafe26HU26G4Yjz00ENZ/9e2qqVQu5vL\nLrssc158YpoOMz/xxBPpDayJNPZ8/9aLLbbYIu9ls8wyCxBaGOm1nTBhQtb1NthgAyC0f4r+rVTz\n4eVa2G45STQzMzOzBCeJDYjumUaXM4Ow/Nf6668P1NYyds8++2ziPLXrqaXHUYy33nor69+WQm0z\n1CYl2ki9TZs2FRlTKamgvV7TlkIojdC/f//9dyWHk5qHH34YgN133z3vdZZYYgkARowYkcaQSqJH\njx5AMmW6+uqrM6cPPPDAVMdUDrPO2vjPjzfeeANIThTVdmynnXYCkulhraiF7ZWTRDMzMzNLcJIY\noaX21LgzXv8AYS/vjjvuAKBjx44pja75PvroIwBee+21xGVa5mjddddNdUxpGTJkSIOXr7766imN\nJF3jx48HQuuIRRddNHPZ8ssvX5ExlVLXrl0rPYSKi6eo9V6TqAbZgwcPBsJSbbkcfvjhALRt27b8\nAyuRFVZYAUi+rjPP3PIynZtvvhmA3377Lev8TTfdFICDDz449TGVg1LV2WabrcIjSWp57zozMzMz\na5STRELtx6RJk4CwRFuUfuGfcsopQG0liDJjxgwAfvnll8Rliy22WNrDKTs1pQV45ZVXGrxuvS7H\nd88992T9v95Spg4dOuQ8P9o0fc0110xrOKmZNm1a5nR85nq0sXA90Szmiy++GIBnnnkm73VXWmkl\nICxyUIt01CpXDXm903dxdF4AwMILLwyEhLheqLl7NS5w4CTRzMzMzBKcJAKXX345kL2sU5wWjF9o\noYVSGVPaNt5440oPoeSiSaL2TOM0O71e633iC8jvuOOOFRpJecVngqpurV7pqAAkl+OrxjSiFNRh\nYuTIkTkv79KlS+b0Y489BlT38nuNUW3ic889V+GRpCO65N6gQYMA+PPPP7Ous/baawP1832l7VY1\nz3Kuz29GMzMzM2uWFp0kTp06FUh24Z977rmB7I7w88wzT3oDq4Cll1660kMouVGjRjV6nQEDBgC1\n22crH723lTKJ3tv1ZpFFFgFCh4J6d9FFF2VOK41YZZVVgNqayVsI9chTupQvdVF6CLWdIMq9994L\n1MaqHKUQTYhvueWWnNc5+eST0xpOWenI1k8//QRU93bZSaKZmZmZJbTIJFG1D+ussw4AH3/8cdbl\nmlG11157pTuwMhs6dCiQe8+0HvsjFrK6SufOnVMYSfrGjh0LwNdffw2ElSdUt1ZvtPKC1nD97LPP\nMpdpNv9cc82V/sBSUM31TE0VXeFKM5RVY6zHq44TxxxzDFAf6WGU+vVGZ+rXow8//BCAs846K+91\nTjjhBABWXnnlVMZUbprjoNrp3XbbrZLDaZCTRDMzMzNL8I9EMzMzM0tokYebtTB8/DCzDmtss802\nqY8pDfFlnuq1IFqTNR555JG811Hz8Nlnnz2VMaUt3iZkjjnmAGDOOeesxHDKLr6s4osvvpg5rQkN\nW2+9dapjKqdhw4YlzquHUgJNUok2wdahuTgdZj7zzDPLP7AKuPrqq4H6LCeIGj16NACvvvpq3uuc\neOKJQP1NMBQti1uNnCSamZmZWUKLShLfffddAHbeeees89UyQtPr67XdzeTJkys9hFRoYtKXX36Z\n9zobbrjWPWzuAAAgAElEQVQhUN17cM3x0UcfZf1/o402qtBI0qEG0rnScS3nVk9JolocQUiaoi27\napWO4nzyySeJy+KvbT1OtouKH/mpN7/99hsAY8aMyXsdTUir1yMgtcBJopmZmZkltKgk8dxzzwXg\n999/B6B169YAHHjggQC0adOmMgNLSbTZLIS2KAALLLBAyqOprEMPPbTSQygLpajxett6XY4vLlfq\n8tBDDwFwwQUXpD2csqm3emIlh7/++iuQ+3VcfPHFgfBeXm+99dIZXIXU22sc179/fwBGjBiRuKx9\n+/ZAaKrdqlWr9AZmWZwkmpmZmVlC3SeJhx12WOb0TTfdlHWZaniUMNarZ599FoDp06dnnb/BBhtk\nTmvPrR7o8eay3HLLASGVqDevvfYakJwROt9881ViOFWha9eulR5CyUWTNr2nl1lmmUoNp8nUIHur\nrbYC4Isvvsh73T59+gAwePDg8g+sCtRrTeJff/0FNDybuUuXLkBomF5vlJjXAieJZmZmZpZQt0mi\n+m3dddddict69eoFwEknnZTqmCrl22+/BUItpmjZp3oT7ZEXp9Sl3pbwEs3kFdWdRutP61GHDh0A\n6N27NwCjRo3KXNZQOlVr3nvvvcR5SolrMS0eNGgQELbXDanX7VU+qpW/5pprKjyS0rrnnnsAeOml\nl7LOj3aauPHGG9McUuriKaqWJqxGThLNzMzMLKHuksRffvkFCHUrX3/9deI6p59+OgCrrLJKegOr\nAvHali233LJCIymPP//8Ewgr6rREw4cPz/q/+otppYK///47c9nMM9fPPuKss/5vU6aVZaIzQ3/8\n8ceKjKkcpkyZkjivFmsu33//fQAuvfTSnJdH6ysnTZqUypiqVb3VJA4ZMiTn+epTDPVbMy5KiS++\n+GIgdGDQc3PwwQdXZmA51M+3hJmZmZmVjH8kmpmZmVlC3R1uPuWUUwC4+eabE5fpvNVWWy3VMVUr\nLYEFcOSRRwLZbXFqzbBhw4CGD0998MEHAHzzzTdAbRb7NyR+OPKdd94BoGPHjkBokQP1eUgnV9uQ\nCRMmVGo4JffKK68A2YfTx40bV6nhNJkmL+Q7lBo99NhS6TXWv2oBVKtUDhSffKWyl+233z71MVWK\ntsd77rknAJdffjkQJl36cLOZmZmZVbW6SRJ/+uknAJ577rms8xdbbLHMabW+URF/Szd27NjM6Xpo\nkVJI49Wll14aqL8EURZddFEAJk+eDMDKK68MhJYwutxqkyabHXvssZnzanECklKjAQMGZJ3fvXt3\nIGyrW7J4Kj5y5MjMZQMHDqzImJpj8803B+Dzzz/POn+nnXYC6vPIRmM00a6a1d7WxczMzMzKrm6S\nxKlTpwLw8ssvZ53fr1+/zOl6baDcGO2h9ejRA4Bll10WgDPPPDNznYUWWij9gZXYjjvuCMAjjzwC\n5G7IWu9tj+JJekvTt29fAF5//fXMefVU36bPbq1bYIEFAOjZsycQmsAfdNBBQMvdVkfFaxKjS23q\nPa36+mpuNK5axPhSdGqevddee6U+pmqx0UYbAXD++ecDsOSSS1ZyODk5STQzMzOzhJmis+SqSNGD\n0mzVddddF4BOnToB2Y2V1XDX6tudd94JwK677po576ijjgJCk3W/F6yWtW3bNnNa9aba9ll9ePTR\nRwHYYostgHAkCODCCy8EYPXVV09/YEXScrC33347ENJ+1aXmWjrXUtNop3YniWZmZmaWUDdJopmZ\nmZkVzEmimZmZmRXPPxLNzMzMLME/Es3MzMwswT8SzczMzCzBPxLNzMzMLME/Es3MzMwswT8SzczM\nzCzBPxLNzMzMLME/Es3MzMwswT8SzczMzCzBPxLNzMzMLME/Es3MzMwsYdZKD6ASdt55ZwDuvvtu\nANq1awfAbrvtBkC3bt0A2G677TJ/M88886Q5xJK4/vrrAbjllluA8Lj79esHwDLLLJO57vHHHw/A\n/vvvn+YQy+KGG24AYMiQIZnzNt54YwB69uwJwNprrw3AHHPMAUCrVq3SHKKV2SOPPJI5fd999wFw\n9dVXAzBw4EAAzjjjjPQHZqn4888/AZg+fToQPt9zzz13xcZkVqjHHnsMgI8//hiAHj16ZC6bZZZZ\ngOzv73JykmhmZmZmCTP9888/lR5DLmUd1EUXXQTA7bffDsArr7wCwEwzzZR1vRVXXDFz+vDDDwfg\nwAMPLOfQSuLiiy8GQjqovWrRax59vLPO+r9QeYUVVgDg8ssvB2Ddddct72DLYNiwYQAccsghmfN+\n+OEHIPnYlTCeeOKJQEgYAWafffbyD7YJfv75ZwDefffdzHmDBg0CQmqmx6nX88wzzwSy0/F68swz\nzwBw9tlnA/Doo49mLtNrHX/tdSShXp8T+euvv4Ds7YC2gb/88gsAa621FgC9evUCktvCaqD3/ZQp\nUwAYN24cAE8++WTiul9//TUAI0aMAGCJJZYAwvti2WWXLetYG/Pggw9mTi+yyCIATJgwAYAZM2Zk\nXTfX9lrGjBkDhM/9LrvsAoRtoBx77LGZ02PHjgXgqaeeavL45dlnn815W/ocAvz6668F3daSSy6Z\nOf2f//wHgH322ad5A6wxL730EgC9e/cG4LvvvgPC+xfC95JeY72X55xzzqbcZaMfdCeJZmZmZpbQ\nIpNE0R7OTz/9BMDIkSOz/n388ccz1/39998BOOiggwC48sor0xhik5x00kkAnHvuuTkvb2jPVDp1\n6gSE52LVVVct5RBT8fbbb2dOa+/5rLPOAuCrr74CQsIom266aea0klili5VOFt955x0Att9+ewAm\nTZqUuSz+msb/v9hiiwEhfQGYf/75yzzi8lGqpMRCSaoe72abbZa57rbbbgvA5MmTgfAeUM1qLRwd\naAo9R0rUb7311kb/RjV8bdq0Kd/Ammi//fYDYOjQoU2+DSUyp59+OgB77rlns8dVDL0vtT0CaN26\nNRC2SYUc+SkFJczNobreU045Jev86PdF9LMY9d577wEh7Y3SY1WN/HHHHQfA0ksv3cwRV7d9990X\ngJtuuqngvznhhBOAsF0rkpNEMzMzMyuefySamZmZWUKLbIEjKvTUv3379s36V0WkAEcffTQAd9xx\nBxCmn+v8WhQ9DBAt9Af47LPPgBB71+Lh5ujEI51WIfRzzz0HwMEHHwyEQ9OjR4/O/I1OP/zww0D+\nwyblNn78eCAUM3/55ZdA9uEnjU2HVnUdlRx88sknQPYhx6OOOqqMoy6PfIfc1dpIj//II49M/K0m\nqOh506SeeqH3yaeffgqE9/Y333wDhFZfAP379wfCZAlNfNBh2MGDB6cw4uJo/Hod11hjDQC6du0K\nwMwz58881PZLk71OPvlkIL3Dzffffz8AL774IhBKASAc4i+n6ESd5ZZbrmz3o0lF0fdavjIdHVb/\n7bffgOzJL1tvvTUA1113HRBawpx66qkA7LXXXqUbdBV4/fXXARg1alTOy6MTKl944YWsyzQBT4eq\nS90ax0mimZmZmSW06IkrxVCLjfXXXx+Atm3bAvDRRx8BMO+881ZkXLl8//33QCjS/vHHH7Mu195z\n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\nmZlZgn8kmpmZmVnCrJUegJmZWUv322+/AfD8888D8NxzzwEwceJEAEaMGJG57vrrrw/AqquuCkC/\nfv0AWGaZZVIZq7UcThLNzMzMLME/Es3MzMwsYaZ//vmn0mPIpSyDOvfccwF46623APj4448B6N27\nNwCrr746AJtuumk57t6sJKZPnw7AzTffnDnv3nvvBeCzzz4D4P333wdggw02AMJhqW233TbzNz16\n9Cj/YEvk66+/BuDSSy8F4O677wbg3XffzXn9Nm3aZE7r873ssssCcMQRRwAw//zzl2ewZkX49ddf\nAdhvv/0AGDZsWNG3scACCwAwatQoALp3716i0VlzzTTTTInzFl10UQDWXHNNAI4++mgA1lprrfQG\n9j/JwcU4STQzMzOzhBaVJA4ePBiAO+64I+t8pS6//PILAAsttBAABx54YOY6O++8MwArrrhiOYbW\nqPvuuw+Ar776CgiFyn/++Wejf6v0aPPNN886f7XVVsuc7tatW0nGaeU3btw4AP7v//4vc96CCy4I\nwP777w/AbLPNBsATTzwBhPf4l19+mfkbvadvueUWAGaZZZZyDrtoN910U+b0oYceCsDPP/8MQOfO\nnQFYaqmlcv6tPssAY8aMybps+eWXB+Cee+4B0v9M//777wDccMMNmfP23HNPIDsBtZbho48+AqBr\n164AfP/9902+re222w6A4cOHA7lTrErRbw1td3Q0oFOnTgA89dRTmevm+1zXop122ilx3n//+18A\nXnrppazzL7jgAgD69+9f/oH9j5NEMzMzMytei0oS83nvvfcAuPzyywG49dZbgew9ulatWgHhl/5h\nhx2W5hAztQtjx44t2W0ussgiidNKT3v16gVAx44dS3Z/TaE2EBDq7uaee24A+vbtW5Ex6f7btWtX\nkftXTWI0Ed9+++2B/HV2P/30EwADBw7MnHfJJZcAcOONNwKw9957l3ysxVDKqZrg119/PXNZz549\ngTBmpX+zzpq7i9fff/+dOT1jxgwArrzySgAGDRoEwB9//AHACy+8AIR0stRWXnllAGae+X/75H/9\n9RcAb7/9duY6yy23HBAS4MZEH9/JJ58MhPpT1afVIn0fPfroo5nz7rrrLgBefPFFABZffHEAhg4d\nCkCHDh3SHGLZnH766QCccsopAGy55ZYA7LDDDgDMNddcib958sknAbjqqquyztd3WjW1xNGYlOTH\n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\nqRwZM2YMAOeddx4AH3/8MQCTJk0CYOGFFy7NwApMnz59ALjooosAbwvGmNLy3nvvAbDZZpsB0KFD\nBwCef/75ko3JJMNbb70FwLnnnguE85VRo0YB0KlTp5KMK4qVRGOMMcYYE6PqlcRsjB07ttRDKDvO\nOOMMAN544w0AmjZtmvb/NttsU5qBFYi7774bgBkzZgCw8sorA7DiiiuWbEymvOjdu3fq9rhx44DS\nqTlLL700AKeddhoAZ599dknGUUn8+eefqds77bQTEL6/yZMnA9CqVavkB1YLa6+9NhAUxKlTp5Zy\nOEXnqquuAsIsjthrr71Stx988MFEx1Qq3n//fQBGjBgBQJMmTdKWW0k0xhhjjDFlSdUric2bN0/d\nljr2ySefADBo0CAADjnkkKSHVVJ+/fVXAG6//fbUso8++ihtnWWXXRaobAUxqgxdeeWVAPz1118A\nDBs2DAg+1cbCc889l7o9c+ZMIKjI3377LQD//PMPAJdeeikA55xzTpJDTAypS8cffzwAI0eOTN13\nzTXXlGRMGsNPP/0EwDrrrFOScVQSv/zyCwAHHnhgapm8XVJm5EHWMb+c+PzzzwH48ccf0/6XV3H9\n9dcvxbAKzrRp0wC46667gPDdiGj9QGPh+++/T/v/1ltvBeDII48sxXCyYiXRGGOMMcbE8EmiMcYY\nY4yJUfXTzauuumrq9gILLACEaTZNrzU2ZJI9+eSTY/dttNFGAJx//vmJjqmQPPnkk0AwSEOYZt56\n660B6Ny5c/IDKyGawtK0G4TiDDHvvPMC4bO64447gOqbbtb7kh1BUz73339/ap3ddtst0TF98803\nABx22GFAsMl069Yt0XFUEq+//joA1113HRD2+2wcffTRiYypPihmTEWCYu7cuaUYTtF44IEHgGD3\nyqR9+/ZJDqekyOLTv3//tOVRy0S5YCXRGGOMMcbEqDol8csvvwTgjz/+AODTTz9N3SczuOjbty8Q\n4hLWWmutJIZYMkaPHg3ArrvuCqQbhxWWravx5ZdfPuHRFQ4pDNFIDKHA2vnnnz/RMZWKJ554AoDd\nd98dCGphPmg7qRZuuukmICjoikG67777gOTVwyg//PADAFOmTAGC4l2X76uxMGfOHABOOukkAN58\n882c655wwglAZRV/KJardevWJR5JYXjhhRcAuPDCC9OWL7bYYgAsscQSAOy5557JDixhZs+enbqt\n39mff/65VMPJGyuJxhhjjDEmRtUpiZnhyFHfodSj//73v0C4So/G5FQj3333HRBa7klBjCqJKr2v\nZAXxs88+A0JwdhSFkmZezVYrivqQ2pIPUtKHDh0KQIsWLQo+rqSIXqHvu+++QAhWlkKjyA0piqVE\nMS5CbbpM4JVXXgHCZ5OpIEaPZ0cccQQQoozmm6/8f+rWWGMNAI499lggKGyVjrzhv/32GxAUxAED\nBgCw8cYbA9CsWbMSjC45NGMB6TOcAGeeeSYACy64YKJjygcricYYY4wxJkb5X141EAVHQ6jaFMst\ntxxQ/UqirqpfffVVIPgPpR5CdfjPpBipej1KOV+pFQNVMWcqVNnQlX737t2B9ESASkOePqkxEILT\nDzjgAAAuv/xyoDwURHHPPfek/a+UARP85ddffz0AY8aMSbtfils0zUBV4pWE1G+Falcy0Rk8VW+L\n7bffHoC999470TGVCiUX3HLLLbH7WrZsCYTfp3L0IFtJNMYYY4wxMapeSYyqSn///Xfafapqltqi\npuITJ06MPc8iiywChArI9dZbr/CDLTC33XYbAM8++2zacuVV6f1XOo8//jgQmqILKcUAq6++eqJj\nShq12xs4cCAQchGFWu3tv//+qWXZvJuVilSYQw89FIBRo0al7rv44ouBcLVejpXt7777btGee9as\nWUB69qm2l5VWWgmARx55BEjfZ8oFzXJEW0oCrLDCCkDInKsk9VCKN8Dhhx8OhN+qp556Cgge8kpE\nqj3A1KlT0+476qijkh5OSdH5xMcffxy7T21vy9l/aiXRGGOMMcbEqFolUb4OVbdlQ9VxquqcPn16\nrc976aWXAtCmTRsABg8eDMAGG2wApPsepeoknfY/YcIEIN4kXPlw1aIgCn2P8i4JNZKHUDlYTUSV\nFV25a7vP9LZIQbzxxhsTGl2yHHTQQUBQEKUeQnkriELZnoVE6qAURB0XokjlufrqqwG49tprCz6O\n+vDaa6+lbitnLxN1zunSpUsiYyokq622Wuq2sn1VnV2X47PyNbVta8ar1GTb1kwcVXaXM1YSjTHG\nGGNMjKpVEp955hkA3nrrrZzr5Or1qXy4Vq1apZbJz6j+mh9++CEA//73v4FQQRn1vp166qlAckri\njBkzgOCb1JWpqrfr0lFCfUPHjx8PhH6bUX+jfG668tXzL7roovV7A/VEaq7YdtttAdhqq60SHUfS\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7feedf17d748>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(9,9))\n",
    "example_images = np.r_[X[:12000:600], X[13000:30600:600], X[30600:60000:590]]\n",
    "plot_digits(example_images, images_per_row=10)\n",
    "save_fig(\"more_digits_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.0"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y[36000]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "shuffle_index = np.random.permutation(60000)\n",
    "X_train, y_train = X_train[shuffle_index], y_train[shuffle_index]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Binary classifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_train_5 = (y_train == 5)\n",
    "y_test_5 = (y_test == 5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/ageron/.virtualenvs/ml/lib/python3.5/site-packages/sklearn/linear_model/stochastic_gradient.py:84: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "SGDClassifier(alpha=0.0001, average=False, class_weight=None, epsilon=0.1,\n",
       "       eta0=0.0, fit_intercept=True, l1_ratio=0.15,\n",
       "       learning_rate='optimal', loss='hinge', max_iter=5, n_iter=None,\n",
       "       n_jobs=1, penalty='l2', power_t=0.5, random_state=42, shuffle=True,\n",
       "       tol=None, verbose=0, warm_start=False)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import SGDClassifier\n",
    "\n",
    "sgd_clf = SGDClassifier(max_iter=5, random_state=42)\n",
    "sgd_clf.fit(X_train, y_train_5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True], dtype=bool)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.9502 ,  0.96565,  0.96495])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score\n",
    "cross_val_score(sgd_clf, X_train, y_train_5, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9502\n",
      "0.96565\n",
      "0.96495\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import StratifiedKFold\n",
    "from sklearn.base import clone\n",
    "\n",
    "skfolds = StratifiedKFold(n_splits=3, random_state=42)\n",
    "\n",
    "for train_index, test_index in skfolds.split(X_train, y_train_5):\n",
    "    clone_clf = clone(sgd_clf)\n",
    "    X_train_folds = X_train[train_index]\n",
    "    y_train_folds = (y_train_5[train_index])\n",
    "    X_test_fold = X_train[test_index]\n",
    "    y_test_fold = (y_train_5[test_index])\n",
    "\n",
    "    clone_clf.fit(X_train_folds, y_train_folds)\n",
    "    y_pred = clone_clf.predict(X_test_fold)\n",
    "    n_correct = sum(y_pred == y_test_fold)\n",
    "    print(n_correct / len(y_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.base import BaseEstimator\n",
    "class Never5Classifier(BaseEstimator):\n",
    "    def fit(self, X, y=None):\n",
    "        pass\n",
    "    def predict(self, X):\n",
    "        return np.zeros((len(X), 1), dtype=bool)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.909  ,  0.90715,  0.9128 ])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "never_5_clf = Never5Classifier()\n",
    "cross_val_score(never_5_clf, X_train, y_train_5, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.model_selection import cross_val_predict\n",
    "\n",
    "y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[53272,  1307],\n",
       "       [ 1077,  4344]])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "confusion_matrix(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_train_perfect_predictions = y_train_5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[54579,     0],\n",
       "       [    0,  5421]])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "confusion_matrix(y_train_5, y_train_perfect_predictions)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.76871350203503808"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "precision_score(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7687135020350381"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "4344 / (4344 + 1307)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.80132816823464303"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.801328168234643"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "4344 / (4344 + 1077)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.78468208092485547"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import f1_score\n",
    "f1_score(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7846820809248555"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "4344 / (4344 + (1077 + 1307)/2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 161855.74572176])"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores = sgd_clf.decision_function([some_digit])\n",
    "y_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "threshold = 0\n",
    "y_some_digit_pred = (y_scores > threshold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True], dtype=bool)"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False], dtype=bool)"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "threshold = 200000\n",
    "y_some_digit_pred = (y_scores > threshold)\n",
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3,\n",
    "                             method=\"decision_function\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note: there is an [issue](https://github.com/scikit-learn/scikit-learn/issues/9589) introduced in Scikit-Learn 0.19.0 where the result of `cross_val_predict()` is incorrect in the binary classification case when using `method=\"decision_function\"`, as in the code above. The resulting array has an extra first dimension full of 0s. We need to add this small hack for now to work around this issue:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000, 2)"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# hack to work around issue #9589 introduced in Scikit-Learn 0.19.0\n",
    "if y_scores.ndim == 2:\n",
    "    y_scores = y_scores[:, 1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.metrics import precision_recall_curve\n",
    "\n",
    "precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure precision_recall_vs_threshold_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nrkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7feedc119ba8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_precision_recall_vs_threshold(precisions, recalls, thresholds):\n",
    "    plt.plot(thresholds, precisions[:-1], \"b--\", label=\"Precision\", linewidth=2)\n",
    "    plt.plot(thresholds, recalls[:-1], \"g-\", label=\"Recall\", linewidth=2)\n",
    "    plt.xlabel(\"Threshold\", fontsize=16)\n",
    "    plt.legend(loc=\"upper left\", fontsize=16)\n",
    "    plt.ylim([0, 1])\n",
    "\n",
    "plt.figure(figsize=(8, 4))\n",
    "plot_precision_recall_vs_threshold(precisions, recalls, thresholds)\n",
    "plt.xlim([-700000, 700000])\n",
    "save_fig(\"precision_recall_vs_threshold_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(y_train_pred == (y_scores > 0)).all()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_train_pred_90 = (y_scores > 70000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.86592051164915484"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "precision_score(y_train_5, y_train_pred_90)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.69931746910164172"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred_90)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure precision_vs_recall_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nP9OECbnna+7c0qvVqFE5BC5YkNePPz6H2fnz83OVBg/OP+9ee+VgOnx4DloLFuTepg03zHVLUl9h\nwOmgbcD58IfzQ/MA9t03T5dw7bV5uxrX8uUrPxJgxYrK3MmVUvuw/PzzOVzMmpUDz4kn5vFLbS8T\nDhiQA9G66+YxTkOGwJZb5tDym9/0vqbu2njjXPuTT+b1t789P6X7uuvy3w9JqicGnA7aBpxTT80P\n94N8yeb55+FNbyqwOPU7Cxbk3pRVhavXX88h4w1vyKFn3XXzcu7cHJTmzs2X8wYMyOOuhg7NPVDj\nx+f3H3wwX0K8+uqVv3v48O4NDo/Ijx2YPDnv/9pr8J73eHu/pOIYcDpoG3B++tP2z46R+otly3Kv\n1Rpr5JB1xx05FA0fni+/DR+eHyR57rnd+7611srzqX3ykzmQzZmT78gbPjxfups7N18G3W233IM2\nd27+zNy5ubdq6dIc4DbcsLo/t6TGYcDpoLm5OW211TT+9Kd8y/Tw4UVXJNWvV17JD5VsnS9tq61y\nj1C1tfZs9aVHNEiqLQNOB83NzWnq1GmkZPe61FMLF+aB6I8+mqcIeeihPH5o0iS47758F9izz+Zx\nPKNG5fFHDzzQ/tlGgwfnu+aGDctBqjOtA6F33DHfXbfmmnn7PvvkmwT23DPfzr/rrvn7vNNM6j8M\nOB00NzenaR0f9yupcK++mscKzZtXme/bdts8Hulzn8tzyNkbJDUWA04HBhyp/i1cCI88km/jj8g9\nM7NmwZQp8Kc/5fchP9Op9aGd5TjggPzU69Y7xyT1PQacDgw4UmNZsSK//v3vfAv+44/DH/+YA9Ks\nWav//Npr57so114bdtkFPvrR/AyhMWPqcw46SZkBpwMDjtS/LF8O//xnnuz1Zz/Lz/l5+OHuf37z\nzeGzn80PeFy+HLbeOo8FevXV/MBIe4CkYhhwOjDgSIJ8metvf8u9N+efn3uB/v73PG7ntde6/z3H\nH5+fP7TXXoYdqZYMOB0YcCR1x/z5cMkl8LWv5Z6aTTbJgQjyk7CXL1/5M7vvnqf1ePBBuOgieOMb\na1qy1K8YcDow4EjqjdZpPe68M/fezJu36oHOZ52Vb5U/7LDcOySpMgw4HRhwJFXaXXfBxRfnByH+\n+tf5mT2daWrKD0088UQnN5V6y4DTgQFHUi2cc06+m+vhh7ueWX6//TqfI0zS6vU24PisX0nqgVNO\n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\n3ll7AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7feedc119358>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_precision_vs_recall(precisions, recalls):\n",
    "    plt.plot(recalls, precisions, \"b-\", linewidth=2)\n",
    "    plt.xlabel(\"Recall\", fontsize=16)\n",
    "    plt.ylabel(\"Precision\", fontsize=16)\n",
    "    plt.axis([0, 1, 0, 1])\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "plot_precision_vs_recall(precisions, recalls)\n",
    "save_fig(\"precision_vs_recall_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ROC curves"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.metrics import roc_curve\n",
    "\n",
    "fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure roc_curve_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nAwYM4Kc//WncIYmIiMTyoL9rgWJgK/AkMMrd3zKz3ma2O6XcOOBo4HUz2x0tkzM5gRoOcmPjxo30\n7duXe+65h1dffTXucERERL6Q8+fguPt24KIK1i8iDEIuf93uUM+h28Rr3+zZsxkxYgT79+9n+vTp\nDB48OO6QREREvqCpGiRrixcvZuDAgbRv354VK1YouRERkbyTzAQn7gASqqSkBICePXvy+OOPs3Tp\nUjp06BBzVCIiIl+VzARHGU6NcnemTp1Ku3btePfddzEzhg8fTsOGDeMOTUREpEKJTHCk5uzcuZMh\nQ4YwYsQITjvtNBo3bhx3SCIiItVKZIKj56/UjOXLl9O1a1eeeuopxo0bx7x582jTpk3cYYmIiFQr\njtnEpY6YOnUq+/btY+HChfTsmdE8pyIiInkhoS04cUdQd3300UesWbMGgAcffJCVK1cquRERkTon\nmQmO7qM6JAsWLKBz585ceumlHDhwgOLiYs0lJSIidVIyExzlN1kpLS3lzjvvpF+/fjRv3pzp06dT\nr14ifzRERKRAJHIMjvKbzG3bto2LLrqIJUuWMGLECB566CHdKSUiInVeIhMcyVzz5s1p2rQpM2bM\n4PLLL487HBERkRqRyH4IdVFVraSkhLFjx/LRRx/RoEEDXnrpJSU3IiKSKIlMcLbu3Bt3CHlrzZo1\nnH322dx333289NJLgJ4bJCIiyZPIBOe4FsVxh5B33J1HH32Ubt26sWXLFubMmcPw4cPjDktERKRW\nJDLBaVCkFol0v/71rxk5ciQ9evRg1apV9O/fP+6QREREak0iBxkrvfnSgQMHqFevHkOHDsXMGD16\nNEVFRXGHJSIiUqsS2YKjMSUhsXnggQfo168fpaWltGrVihtvvFHJjYiIFIREJjj1CjzB2bp1KwMG\nDODWW2+lZcuWfP7553GHJCIiklMJTXDijiA+8+fPp3PnzixcuJDJkycza9YsmjRpEndYIiIiOZXI\nMTiF2oJTWlrKT37yE4466ijmzZvH6aefHndIIiIisUhkglNo+c37779Pq1atKC4u5sUXX6RNmzY0\natQo7rBERERik9AuqsLJcP74xz9yxhlnMHbsWAA6dOig5EZERApeMhOcRL6rg5WUlDBq1CgGDRrE\nySefzOjRo+MOSUREJG8kMhVIegvO2rVr6d69O5MnT+bWW29l0aJFtG/fPu6wRERE8kYix+AkXb16\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7feedc0c5748>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_roc_curve(fpr, tpr, label=None):\n",
    "    plt.plot(fpr, tpr, linewidth=2, label=label)\n",
    "    plt.plot([0, 1], [0, 1], 'k--')\n",
    "    plt.axis([0, 1, 0, 1])\n",
    "    plt.xlabel('False Positive Rate', fontsize=16)\n",
    "    plt.ylabel('True Positive Rate', fontsize=16)\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "plot_roc_curve(fpr, tpr)\n",
    "save_fig(\"roc_curve_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.96244965559671547"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import roc_auc_score\n",
    "\n",
    "roc_auc_score(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "forest_clf = RandomForestClassifier(random_state=42)\n",
    "y_probas_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3,\n",
    "                                    method=\"predict_proba\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_scores_forest = y_probas_forest[:, 1] # score = proba of positive class\n",
    "fpr_forest, tpr_forest, thresholds_forest = roc_curve(y_train_5,y_scores_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure roc_curve_comparison_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7feedf0d8eb8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 6))\n",
    "plt.plot(fpr, tpr, \"b:\", linewidth=2, label=\"SGD\")\n",
    "plot_roc_curve(fpr_forest, tpr_forest, \"Random Forest\")\n",
    "plt.legend(loc=\"lower right\", fontsize=16)\n",
    "save_fig(\"roc_curve_comparison_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.99312433660038291"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "roc_auc_score(y_train_5, y_scores_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.98529734474434938"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_pred_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3)\n",
    "precision_score(y_train_5, y_train_pred_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.82826046854823832"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred_forest)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Multiclass classification"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 5.])"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.fit(X_train, y_train)\n",
    "sgd_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-311402.62954431, -363517.28355739, -446449.5306454 ,\n",
       "        -183226.61023518, -414337.15339485,  161855.74572176,\n",
       "        -452576.39616343, -471957.14962573, -518542.33997148,\n",
       "        -536774.63961222]])"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "some_digit_scores = sgd_clf.decision_function([some_digit])\n",
    "some_digit_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.argmax(some_digit_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.])"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.classes_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.0"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.classes_[5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/ageron/.virtualenvs/ml/lib/python3.5/site-packages/sklearn/linear_model/stochastic_gradient.py:84: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([ 5.])"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.multiclass import OneVsOneClassifier\n",
    "ovo_clf = OneVsOneClassifier(SGDClassifier(max_iter=5, random_state=42))\n",
    "ovo_clf.fit(X_train, y_train)\n",
    "ovo_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "45"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(ovo_clf.estimators_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 5.])"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "forest_clf.fit(X_train, y_train)\n",
    "forest_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.1,  0. ,  0. ,  0.1,  0. ,  0.8,  0. ,  0. ,  0. ,  0. ]])"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "forest_clf.predict_proba([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.84063187,  0.84899245,  0.86652998])"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cross_val_score(sgd_clf, X_train, y_train, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.91011798,  0.90874544,  0.906636  ])"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "scaler = StandardScaler()\n",
    "X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))\n",
    "cross_val_score(sgd_clf, X_train_scaled, y_train, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[5725,    3,   24,    9,   10,   49,   50,   10,   39,    4],\n",
       "       [   2, 6493,   43,   25,    7,   40,    5,   10,  109,    8],\n",
       "       [  51,   41, 5321,  104,   89,   26,   87,   60,  166,   13],\n",
       "       [  47,   46,  141, 5342,    1,  231,   40,   50,  141,   92],\n",
       "       [  19,   29,   41,   10, 5366,    9,   56,   37,   86,  189],\n",
       "       [  73,   45,   36,  193,   64, 4582,  111,   30,  193,   94],\n",
       "       [  29,   34,   44,    2,   42,   85, 5627,   10,   45,    0],\n",
       "       [  25,   24,   74,   32,   54,   12,    6, 5787,   15,  236],\n",
       "       [  52,  161,   73,  156,   10,  163,   61,   25, 5027,  123],\n",
       "       [  43,   35,   26,   92,  178,   28,    2,  223,   82, 5240]])"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_pred = cross_val_predict(sgd_clf, X_train_scaled, y_train, cv=3)\n",
    "conf_mx = confusion_matrix(y_train, y_train_pred)\n",
    "conf_mx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def plot_confusion_matrix(matrix):\n",
    "    \"\"\"If you prefer color and a colorbar\"\"\"\n",
    "    fig = plt.figure(figsize=(8,8))\n",
    "    ax = fig.add_subplot(111)\n",
    "    cax = ax.matshow(matrix)\n",
    "    fig.colorbar(cax)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure confusion_matrix_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7feedc168b00>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.matshow(conf_mx, cmap=plt.cm.gray)\n",
    "save_fig(\"confusion_matrix_plot\", tight_layout=False)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "row_sums = conf_mx.sum(axis=1, keepdims=True)\n",
    "norm_conf_mx = conf_mx / row_sums"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure confusion_matrix_errors_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP8AAAEFCAYAAAAsdjEBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADUtJREFUeJzt3V+InfWZwPHvk2QSTLpRgxq0UBOWFt0SjduAyOKqoGwN\nLKtVNKysYUFSlHqhFL1xxaq98MJaUOsaDEHasotIFbElNwUpe1G2cTc1lIgkm6ZGG401WZ38aSbJ\nsxdnsgSrc95xz2/emX2+HxjCjC8Pj5N85z1z/rwnMhNJ9czrewFJ/TB+qSjjl4oyfqko45eKMn6p\nKOOXiuo1/ohYFhEvRcShiNgTEX/f5z7DRMSiiNg0uevHEbEtIq7ve68uIuLLEXE0In7U9y5dRMS6\niNgx+W9jV0Rc2fdOU4mIFRHxs4g4EBH7IuKpiFjQ915T6fvM/zRwDFgO3AY8ExFf7XelKS0A3gau\nAs4EHgBeiIgVPe7U1dPAr/peoouIuA54DPhH4M+Avwb+q9elhvsB8D5wPrCawb+Ru3rdaIje4o+I\nJcBNwD9l5nhm/hvwCvAPfe00TGYeysyHMvO3mXkyM18FdgNf63u3qUTEOuAg8PO+d+noO8DDmfnL\nye/zO5n5Tt9LDbESeCEzj2bmPmALMJtPZL2e+b8CHM/Mt0772q+Z5d+w00XEcgb/H7/pe5fPEhFL\ngYeBe/vepYuImA+sAc6NiJ0RsXfyJvQZfe82xPeBdRGxOCK+CFzP4AfArNVn/F8APvrE1/6bwc28\nWS8ixoAfA89n5pt97zOFR4BNmbm370U6Wg6MATcDVzK4CX0Zg1+xZrNfMDhxfQTsBbYCL/e60RB9\nxj8OLP3E15YCH/ewy7RExDzghwzur/hWz+t8pohYDVwLPNH3LtNwZPLPJzPz95n5AfA9YG2PO01p\n8t/DFuAnwBLgHOBsBvdbzFp9xv8WsCAivnza1y5lFt+EBoiIADYxOEPdlJkTPa80lauBFcDvImIf\n8G3gpoj4jz6XmkpmHmBw5jz95aaz/aWny4AvAU9l5h8z8w/AZmbxDyzoMf7MPMTgJ+XDEbEkIv4K\n+DsGZ9TZ7BngYuBvM/PIsIN7thH4cwY3nVcD/wz8FPibPpfqYDNwd0ScFxFnA/cAr/a802eavHWy\nG7gzIhZExFnAeuCNfjebWt8P9d0FnMHgIZJ/Ae7MzFl75o+IC4FvMghpX0SMT37c1vNqnyozD2fm\nvlMfDH7VOpqZ+/vebYhHGDws+RawA/hP4Lu9bjTcN4CvA/uBncAEgx9as1Z4MQ+ppr7P/JJ6YvxS\nUcYvFWX8UlHGLxVl/FJRsyL+iNjQ9w7TNdd2nmv7gju3NiviB+bMN+w0c23nubYvuHNTsyV+STOs\n2TP8ImLOPXVwbGys87EnT55k3rxuPztPnDjxeVcamcxk8Jqkbs44o/+Xz09MTEzr7+TIkTYvtVi4\ncGHnY0+cOMH8+fM7H3/06NHPs9JQmTn0L3tWX2Ps00znGztd5513XpO5Bw4caDIXmFbQ07Fq1aom\nc1vavn17k7krV65sMhfgzTdHfymI48ePdzrOm/1SUcYvFWX8UlHGLxVl/FJRneKfa++sI2m4rg/1\nnf7OOquBn0bEr2fzJbckTW3omX8uvrOOpOG63Oyf8++sI+lPdbnZ3/mddSZf0TRnXtggVdYl/s7v\nrJOZGxlcK35OPrdfqqTLzf45+c46kqY2NP45/M46kqbQ9Uk+c+qddSQN1+lx/sz8ELih8S6SZpBP\n75WKMn6pKOOXijJ+qaim1/DreoHL6Wh5McyzzjqrydyTJ082mQvw4YcfNpl78ODBJnN37drVZC5M\n7wKs03HNNdc0mQuwc+fOkc/s2ohnfqko45eKMn6pKOOXijJ+qSjjl4oyfqko45eKMn6pKOOXijJ+\nqSjjl4oyfqko45eKMn6pKOOXijJ+qSjjl4oyfqko45eKMn6pKOOXimp26e4lS5Zw6aWXjnzu+Pj4\nyGee8sYbbzSZe9999zWZC3DgwIEmc7ds2dJk7u23395kLsCePXuazL3hhnZvU/n888+PfOaxY8c6\nHeeZXyrK+KWijF8qyvilooxfKsr4paKMXypqaPwRsSgiNkXEnoj4OCK2RcT1M7GcpHa6nPkXAG8D\nVwFnAg8AL0TEinZrSWpt6DP8MvMQ8NBpX3o1InYDXwN+22YtSa1N+3f+iFgOfAX4zejXkTRTpvXc\n/ogYA34MPJ+Zb37Kf98AbABYuHDhSBaU1EbnM39EzAN+CBwDvvVpx2Tmxsxck5lrxsbGRrSipBY6\nnfkjIoBNwHJgbWZONN1KUnNdb/Y/A1wMXJuZRxruI2mGdHmc/0Lgm8BqYF9EjE9+3NZ8O0nNdHmo\nbw8QM7CLpBnk03ulooxfKsr4paKMXyqq2dV7M7PzVUSnY8GCZivz3HPPNZl7xx13NJkLMHgKxuid\nPHmyydxVq1Y1mQuDK0a3sHv37iZzAW699daRz3zppZc6HeeZXyrK+KWijF8qyvilooxfKsr4paKM\nXyrK+KWijF8qyvilooxfKsr4paKMXyrK+KWijF8qyvilooxfKsr4paKMXyrK+KWijF8qyviloiIz\nmwweGxvLZcuWjXzu4sWLRz7zlDPPPLPJ3J07dzaZC3Do0KEmc1t9ny+//PImcwHef//9JnOvuOKK\nJnMB7r///pHPvPHGG9m+ffvQa7p75peKMn6pKOOXijJ+qSjjl4oyfqko45eKmlb8EfHliDgaET9q\ntZCkmTHdM//TwK9aLCJpZnWOPyLWAQeBn7dbR9JM6RR/RCwFHgbubbuOpJmyoONxjwCbMnNvxGc/\nZTgiNgAbAObN875EaTYbGn9ErAauBS4bdmxmbgQ2wuCFPf/n7SQ10+XMfzWwAvjd5Fn/C8D8iPiL\nzPzLdqtJaqlL/BuBfz3t828z+GFwZ4uFJM2MofFn5mHg8KnPI2IcOJqZ+1suJqmtrnf4/a/MfKjB\nHpJmmHfJS0UZv1SU8UtFGb9U1LTv8Otq6dKlXHfddSOfu2vXrpHPPGV8fLzJ3HfffbfJXID169c3\nmfvyyy83mbt27domcwGeffbZJnMff/zxJnMBHn300ZHP3L+/2wNxnvmlooxfKsr4paKMXyrK+KWi\njF8qyvilooxfKsr4paKMXyrK+KWijF8qyvilooxfKsr4paKMXyrK+KWijF8qyvilooxfKsr4paIi\ns807aS9atCgvuOCCFnNHPvOUJUuWNJm7bdu2JnMBLrnkkiZzL7ts6Duyfy6bN29uMhfa/f1ddNFF\nTeYCvP76603mZmYMO8Yzv1SU8UtFGb9UlPFLRRm/VJTxS0UZv1RU5/gjYl1E7IiIQxGxKyKubLmY\npLY6vUV3RFwHPAbcCvw7cH7LpSS11yl+4DvAw5n5y8nP32m0j6QZMvRmf0TMB9YA50bEzojYGxFP\nRcQZ7deT1EqX3/mXA2PAzcCVwGrgMuCBTx4YERsiYmtEbD1x4sRIF5U0Wl3iPzL555OZ+fvM/AD4\nHrD2kwdm5sbMXJOZa+bPnz/KPSWN2ND4M/MAsBc4/eV/bV4KKGnGdH2obzNwd0ScFxFnA/cAr7Zb\nS1JrXe/tfwQ4B3gLOAq8AHy31VKS2usUf2ZOAHdNfkj6f8Cn90pFGb9UlPFLRRm/VJTxS0V1fahv\n2jKTiYmJkc89duzYyGeecvHFFzeZe/DgwSZzARYvXtxk7osvvthk7sKFC5vMBTh06FCTubt27Woy\nFwadjNqaNWs6HeeZXyrK+KWijF8qyvilooxfKsr4paKMXyrK+KWijF8qyvilooxfKsr4paKMXyrK\n+KWijF8qyvilooxfKsr4paKMXyrK+KWijF8qqtnVexctWsTKlStHPvfBBx8c+cxTNm7c2GTuk08+\n2WQuwC233NJk7iuvvNJk7mOPPdZkLsCOHTuazH377bebzAV44oknRj7zvffe63ScZ36pKOOXijJ+\nqSjjl4oyfqko45eKMn6pqE7xR8SKiPhZRByIiH0R8VRENHuOgKT2up75fwC8D5wPrAauAu5qtZSk\n9rrGvxJ4ITOPZuY+YAvw1XZrSWqta/zfB9ZFxOKI+CJwPYMfAJLmqK7x/4LBmf4jYC+wFXj5kwdF\nxIaI2BoRWycmJka3paSRGxp/RMxjcJb/CbAEOAc4G/iTV2hk5sbMXJOZa8bGxka9q6QR6nLmXwZ8\nCXgqM/+YmX8ANgNrm24mqamh8WfmB8Bu4M6IWBARZwHrgTdaLyepna6/838D+DqwH9gJTAD3tFpK\nUnudnqiTmduAq9uuImkm+fReqSjjl4oyfqko45eKMn6pqGYvyz1x4gTj4+Mjn3v33XePfOYphw8f\nbjL33HPPbTIX4LXXXmsy9+abb24yt+VlsI8fP95k7vr165vMBbj33nubzR7GM79UlPFLRRm/VJTx\nS0UZv1SU8UtFGb9UlPFLRRm/VJTxS0UZv1SU8UtFGb9UlPFLRRm/VJTxS0UZv1SU8UtFGb9UlPFL\nRRm/VFRkZpvBEfuBPR0PPwf4oMki7cy1nefavuDOn9eFmTn0ktHN4p+OiNiamWv63mM65trOc21f\ncOfWvNkvFWX8UlGzJf6NfS/wOcy1nefavuDOTc2K3/klzbzZcuaXNMOMXyrK+KWijF8qyvilov4H\nwKH6qmoAkLAAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7feedc0f0f60>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "np.fill_diagonal(norm_conf_mx, 0)\n",
    "plt.matshow(norm_conf_mx, cmap=plt.cm.gray)\n",
    "save_fig(\"confusion_matrix_errors_plot\", tight_layout=False)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure error_analysis_digits_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nWLlyJQAff/wxALNmzYro8U8//TQA999/PwBFixaN9hD5559/WLt2LQCPPfYYAH/++ScAq1ev5sCB\nAwAcfvjhmT6HjilYsCBVq1YF4M033wSgRIkSUR9zTtm6dSvNmzcH4KOPPsr0uEqVKgHQu3dvAJo2\nbRrTcek3PHfuXHr16gXA0qVL0x1z3HHH0b59+3S33XrrrQCcfvrpMR0feaA7uxbw06dPB+Czzz4D\nvMV7ZgwYMACAE088EfA+82Tj66+/BmDGjBkATJ06ldWrVwOBjQnANddcA0DNmjX5+eefAejXrx8A\nF1xwAQArVqyI36D/n927dwPefBKKY489Nl7DyRY9e/bMcNtTTz11yMddddVVACxcuDDKI4od//77\nLwBz5swB4K233gLgjTfecMdceumlAEybNg2AUqVKRfr01p3dMAzDMAzDT55QfLS7ff311wFo166d\nu2/s2LEAfPHFF+62VatWAXDMMccAULp0aSCwqpSEW758eQC3wz/jjDM44ojYRQbfeecdICAZazep\nlXF2qVGjBgCTJ0+OugQ9ZswY7rrrrkzvz4ri4z9GO+SOHTtGY5hRQbvhm266yalc+t3ky5f5BkPn\n0ooVKzjjjDNiNr69e/cCcPTRR2fpcQovXnnlldx7771A+O8rB+R6xUfqq5SNrHLUUUcBcP755wMw\ndOhQqlSpkq3niiYvvvgiAI888gjgzYn16tVj0KBBABQuXBiA/Pnzu8dt2bIF8ObOOnXqAN48Fiv2\n798PwPbt2wGYNGmSC7NpTKF46KGHAOjcubNT35KBq6++GoBFixbl6HmSXfn57bffgED4VCHTv/76\nCwicawAtW7Z0UQPdpvPyueeei/SlTPExDMMwDMPwkycUH6kyU6dODTw4LS3sTjyS3XrwMR9//LGL\nO0aTl19+GfB8Mrt37+bII48EoHbt2gBcccUVADRs2DDT59m/fz/dunUDPHPxf//9BwT8CPLQRIt3\n332XW265BYCdO3cCnpdoyJAhXH755Yd8jlNPPRVIrzJceeWVAMyfPz+q480OUnpq1aoFeOZtyHh+\nXHLJJezYsQOA9evXpzvm8ccf59lnn43ZOPft2wcEPv/sqoQ6d+QPizIpr/gEc8oppzg/TbSeM6us\nXr3azTutWrUCvDmmYMGCmT5uz549tGjRAvDmGvkQL7roopiMVf4P+UHk/QhFsWLFADh48KCbS6UQ\n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\nPwArVqygc+fOAFxwwQVAYB4BuPDCCznxxBMByJ8/f44HamSfPXv2ALB+/XrefPNNAN59991091Wv\nXmTvSyUAACAASURBVN3Np8cdd1wCRpl3mDt3LgBbtmwB4L333gNgzZo1/O9//wPgiSeeAODxxx+P\n5ktb5WbDMAzDMAw/eUrxkZpz9dVX53gAUnx69OiR7v+JZNWqVTz66KMAfPDBBwAUKVIEgCuuuILv\nvvsOgJ9//hnwdu0NGzaMy/g0poYNG/Lvv/+GPOa8885j69atAPz666/u9tq1awMwduxYAE444YRY\nDjVL1KpVC4D58+dz2GGBvUKLFi0AqFq1KpA7FSCpoO3atWPjxo0A7N27N90xhx9+OM8++yyAO/ey\nQZ5TfKSMtW/fPuMT/v+cmi9fPq655hrAUxBq1qwJwF133ZWdl802Bw4c4LnnngNg+vTpgKca+5Hy\n2rhxYy699FIASpQoEadRxp69e/cycuRIAB577DEARo8eDUCHDh346quvAChdunRCxqd584MPPmD2\n7NkAbrw33XQTAK1bt3bzZTLw22+/AfDWW28B8NBDD/H333+nO0a/g2bNmrn32L17dwDefvttwFNK\nc4gpPoZhGIZhGH7ylOIjX89TTz2V6TFXXXVVSJ9PuOMBFi5cmJ0hRYVPPvkECKgKmzZtAuC+++4D\n4N577wWgZMmS/PTTTwCULVsW8GKn2rHHit9//x2A8uXLA4Gd7gMPPADgPDHi3HPPdYqP3stzzz3n\nVv16jgULFgDJofz0798fgM8++8ztaoI56aST3Pl3xhlnAFCtWrW4jC9S/vzzTwD69OkD4BSAfPm8\nTZK8KPv27QMC6kXx4sUBePnll4HAri2L5DnFRyrq0qVLncIsxVWqgf9zFUcddRQAgwYNol27dtl5\n6Wyxa9cujj32WACOPPJIAA477DAOP/xwwBvrrl273GPOPfdcIGAIBihVqlTcxhsrevXqlcH/KdW8\ndevWDBw4MAGjgr59+wIwa9YsIDDXZEaVKlX4/PPP4zKucGzfvh2AO++8E8ApVGeeeSYdOnQA4MYb\nbwQ8xfOwww7jhx9+AKBChQpAQCECovXZm+JjGIZhGIbhJ08pPsK/os9qllZmqlEiPicpPfXr13e3\nzZs3D4CLL74408dp9xYvxeevv/4C4OyzzwYC3oGTTjopS88hb0/r1q0BmDFjBgA33HBDtIaZY/bu\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7feed4125048>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cl_a, cl_b = 3, 5\n",
    "X_aa = X_train[(y_train == cl_a) & (y_train_pred == cl_a)]\n",
    "X_ab = X_train[(y_train == cl_a) & (y_train_pred == cl_b)]\n",
    "X_ba = X_train[(y_train == cl_b) & (y_train_pred == cl_a)]\n",
    "X_bb = X_train[(y_train == cl_b) & (y_train_pred == cl_b)]\n",
    "\n",
    "plt.figure(figsize=(8,8))\n",
    "plt.subplot(221); plot_digits(X_aa[:25], images_per_row=5)\n",
    "plt.subplot(222); plot_digits(X_ab[:25], images_per_row=5)\n",
    "plt.subplot(223); plot_digits(X_ba[:25], images_per_row=5)\n",
    "plt.subplot(224); plot_digits(X_bb[:25], images_per_row=5)\n",
    "save_fig(\"error_analysis_digits_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Multilabel classification"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "           metric_params=None, n_jobs=1, n_neighbors=5, p=2,\n",
       "           weights='uniform')"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "y_train_large = (y_train >= 7)\n",
    "y_train_odd = (y_train % 2 == 1)\n",
    "y_multilabel = np.c_[y_train_large, y_train_odd]\n",
    "\n",
    "knn_clf = KNeighborsClassifier()\n",
    "knn_clf.fit(X_train, y_multilabel)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False,  True]], dtype=bool)"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Warning**: the following cell may take a very long time (possibly hours depending on your hardware)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.97709078477525002"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_knn_pred = cross_val_predict(knn_clf, X_train, y_multilabel, cv=3, n_jobs=-1)\n",
    "f1_score(y_multilabel, y_train_knn_pred, average=\"macro\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Multioutput classification"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "noise = np.random.randint(0, 100, (len(X_train), 784))\n",
    "X_train_mod = X_train + noise\n",
    "noise = np.random.randint(0, 100, (len(X_test), 784))\n",
    "X_test_mod = X_test + noise\n",
    "y_train_mod = X_train\n",
    "y_test_mod = X_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure noisy_digit_example_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAADUCAYAAADJJbfOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAEtRJREFUeJzt3Uts1fXWxvFFW2jLpZQC5VLaQoHShhKkBblDjkEkYQQY\n48DEgQONiYaBJl4YKRojCQw0Gpk40LEaJzqQyC1goYAFsVxKSy3QQrmUFnYpl3oG79D1/HFrYa++\n5/sZPt37v/bVdXbOYv2G/fnnnwYAQDRZmX4AAAB4aFAAgJBoUACAkGhQAICQaFAAgJBoUACAkGhQ\nAICQaFAAgJBoUACAkGhQAICQcjJRdGBgwN2vtGvXLvf2xcXF8lplZWVurlY4NTc3u3lvb6+sUVFR\n4ea3bt1y85qaGjdvaGiQNYqKitx8woQJbl5fX59WbTOz4cOHu/np06flfTylpaXyb+pay5cvd/PW\n1lY3v3HjhqxRW1vr5sePH3fzhQsXunlfX5+scfHiRTevrq4eJu+UGewqw1D10O8Sv6AAACHRoAAA\nIdGgAAAh0aAAACENy8R5UI2NjW7R69evu7dX/we7mdnAwICbp1IpN8/OznbzQ4cOyRqjRo1y87lz\n57r53bt33fzYsWOyxrhx49y8oKAgrdu3tbXJGnl5eW6uXpMpU6a4eU9Pj6yRleX/bx41UKIeU3l5\nuaxx7do1N+/v73fzS5cuuXl3d7essWTJEjcvKChgSAIYHAxJAACGJhoUACAkGhQAICQaFAAgJBoU\nACCkjEzx9fb2ukXz8/Pd29+5c0de6/Dhw25+7949N1+zZo2bq8k7M7MLFy64eboTdi0tLbLGmDFj\n3FxNpnV1dbn57NmzZQ31uG7fvp1WDbV+yUxP8an3UL3nJ06ckDXUa9Xe3u7mI0eOdHO1AslMP97C\nwkKm+IDBwRQfAGBookEBAEKiQQEAQqJBAQBCokEBAEKiQQEAQsrImHlXV5db9OjRo+7tn376aXmt\n8+fPu/nUqVPdvKOj4yGP7q/UUlGVqxH3tWvXyhpqUW5Ojn/o8blz59y8qqpK1lCLdYcN86c9Hzx4\n4OZqLN3MbMSIEW6uTq/t7Ox088mTJ8saubm5bq5ODD516pSb37x5U9aoq6tz8/HjxzNmDgwOxswB\nAEMTDQoAEBINCgAQEg0KABASDQoAEJI/IvaIJS0C9agpLDOzwsJCN1cTgWoJqJraMtNHjK9evdrN\n1dLSpKPSm5ub3byoqMjNa2pq3Ly+vl7WUMer37hxw82Li4vdXB0Fb6ZfK1VDTf2ppbNmevnrwYMH\n3Xz06NFuvmjRIllDLQIG8PjwCwoAEBINCgAQEg0KABASDQoAEBINCgAQUkam+JYsWeLmalpPTcWZ\nmWVnZ7v5E0884eZqd1/Sjj61q661tdXNe3t73Vw9VjO9F04d0/5PqEk6NcGo9uepHX1mZmq3o9qN\n2NLSklZtM/1+qBrq85O0U7C/v9/Nk3YEAhhc/IICAIREgwIAhESDAgCERIMCAIREgwIAhJSRE3X7\n+vrcompya8yYMfJaf/zxh5vPnDnTzdXU2LRp02QNdR+1B7CpqcnN79+/L2vk5+e7uXpN1JSiOpnX\nzCyVSrm5Ool21qxZbn7y5ElZY9KkSW6uJuZKS0vdXO0NNNPTiGqqcuLEiW6etG9PTZQuXbqUE3WB\nwcGJugCAoYkGBQAIiQYFAAiJBgUACIkGBQAIiQYFAAgpI8tic3L8sup48zNnzshrDQwMuLkaE1aj\n0+qIeDOzsrIyN1ej4WppqVpyaqZHp9W4tRqRPnbsmKwxZ86ctK519epVN096Huo4+L1797q5OiJe\nLc8108fEq7H/np4eN1efETOzkpIS+TdgKPnmm2/k3zZu3Ojm6p/KVFdXD8pj+rv4BQUACIkGBQAI\niQYFAAiJBgUACIkGBQAIKSNTfHfu3HHzy5cvu3nSklX1t9zcXDfv7u5286ws3avVElJ1VHpxcbGb\nq6k4M7Mvv/zSzdVrMnv2bDdPmuJTr3tlZaWbHzx40M2TjmMvLy9P61pq4lEtsDUza25udvN169a5\nuZr07OzslDXU40V8O3bscPPTp0+ndZ1vv/1W/q2qqsrN1ZTbnj170n5MapG3mqJN9/ZJ91H/DVOT\n1ur2Zvq5/x38ggIAhESDAgCERIMCAIREgwIAhESDAgCElJEj31OplFtUHd+uJmbM9NTavXv33Fzt\n4jtx4oSsUVtb6+Zqf9/06dPTrvHWW2+5uZouVM9vxowZssb+/fvdXB3HPnLkSDefNm2arNHW1ubm\nat+feq1aWlpkDfUct27d6uY1NTVuriYkzfRnLi8vjyPfA0jaL/fss8+6+eOYfhtqNVauXOnm27dv\nd/MJEyaklZvp/44YR74DAIYqGhQAICQaFAAgJBoUACAkGhQAIKSM7OLbt2+fm6u9bOr2ZmbLly93\nczXR0tDQ4ObLli2TNXp7e91cneCqJtA++eQTWWPSpElufu7cubRur/bOmenTM9VrpZ73hg0bZA11\nQu6KFSvcXL3nV65cSbvGzJkz3TxhikhK2v+IzEvak5fuZLLaqflPqF18asotaUI53RpqIm8o4xcU\nACAkGhQAICQaFAAgJBoUACAkGhQAICQaFAAgpIyMmS9ZssTNT5486eZJY6OpVMrN29vb3by0tNTN\nf/75Z1lDLZidMmWKm3d1dbm5WvBqZnbx4kU3V6PhmzdvdnO1lNVMj6xPnDjRzW/duuXmajTcTC/v\nVUdCq9pqcbCZHrNVx2ffvHnTzdXzMzPr7u5289GjR8v7YPCp75JafGyml6Nu2bLFzd977730Hxge\nC35BAQBCokEBAEKiQQEAQqJBAQBCokEBAELKyBSfmjTr6+tz8/LycnkttThUTXpdunTJzefNmydr\ndHR0uPmdO3fc/LXXXnNzNUVnZrZ48WI3LykpcfNTp065+ZNPPilrqNdq1KhRbt7f3+/md+/elTXU\ntdS0Xn19vZsnTctlZ2e7uXrP1VSXmgA1059FPBpNTU1urqZY29ra5LXUYla1WFrVVp8nPD78ggIA\nhESDAgCERIMCAIREgwIAhESDAgCENCzd45EHQyqVcos2Nja6t1+4cKG8Vmtrq5tnZfm9V+1YS6px\n6NAhN3/77bfdXE0FJe1+Kysrc/Phw4e7+e3bt918+/btssb06dPdXL0maiLwwIEDssbSpUvd/OzZ\ns26ujlZXk1hmZmfOnHFztRtRHV0/f/58WUPJzc31RwIz5/F/gf8FtVtPfdbUtJ6azDTTuzvVfdR3\n7/Dhw7JG0ucTf9tDv0v8ggIAhESDAgCERIMCAIREgwIAhESDAgCElJFdfGqSR+1rUxNgZmY9PT1u\nXlFRkVYNNelllv4ut8uXL7v56tWrZQ21p2/EiBFuPnnyZDd//fXXZY3PPvvMzfPy8tz8+vXrbp50\nau+VK1fSutacOXPcfOTIkbKGmrpSuxHVKco5Ofrjn7RvEP+cOilZTev9kynjdO9z/vx5N1enQJuZ\n7d69281XrVqVVm0k4xcUACAkGhQAICQaFAAgJBoUACAkGhQAICQaFAAgpIyMmaujx69evermSaOb\nJ0+edPOxY8e6uTouXC1fNdNj42o0va6uzs2TjmP/6KOP3FwtqlXPWy1fNTP74IMP3PyNN95w8wsX\n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\nAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7feedf0d8f98>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "some_index = 5500\n",
    "plt.subplot(121); plot_digit(X_test_mod[some_index])\n",
    "plt.subplot(122); plot_digit(y_test_mod[some_index])\n",
    "save_fig(\"noisy_digit_example_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure cleaned_digit_example_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7feedc168eb8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "knn_clf.fit(X_train_mod, y_train_mod)\n",
    "clean_digit = knn_clf.predict([X_test_mod[some_index]])\n",
    "plot_digit(clean_digit)\n",
    "save_fig(\"cleaned_digit_example_plot\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Extra material"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Dummy (ie. random) classifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.dummy import DummyClassifier\n",
    "dmy_clf = DummyClassifier()\n",
    "y_probas_dmy = cross_val_predict(dmy_clf, X_train, y_train_5, cv=3, method=\"predict_proba\")\n",
    "y_scores_dmy = y_probas_dmy[:, 1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7feecf4fdef0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fprr, tprr, thresholdsr = roc_curve(y_train_5, y_scores_dmy)\n",
    "plot_roc_curve(fprr, tprr)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## KNN classifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "           metric_params=None, n_jobs=-1, n_neighbors=4, p=2,\n",
       "           weights='distance')"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "knn_clf = KNeighborsClassifier(n_jobs=-1, weights='distance', n_neighbors=4)\n",
    "knn_clf.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_knn_pred = knn_clf.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.97140000000000004"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "accuracy_score(y_test, y_knn_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7feecf3ef358>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from scipy.ndimage.interpolation import shift\n",
    "def shift_digit(digit_array, dx, dy, new=0):\n",
    "    return shift(digit_array.reshape(28, 28), [dy, dx], cval=new).reshape(784)\n",
    "\n",
    "plot_digit(shift_digit(some_digit, 5, 1, new=100))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((300000, 784), (300000,))"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_expanded = [X_train]\n",
    "y_train_expanded = [y_train]\n",
    "for dx, dy in ((1, 0), (-1, 0), (0, 1), (0, -1)):\n",
    "    shifted_images = np.apply_along_axis(shift_digit, axis=1, arr=X_train, dx=dx, dy=dy)\n",
    "    X_train_expanded.append(shifted_images)\n",
    "    y_train_expanded.append(y_train)\n",
    "\n",
    "X_train_expanded = np.concatenate(X_train_expanded)\n",
    "y_train_expanded = np.concatenate(y_train_expanded)\n",
    "X_train_expanded.shape, y_train_expanded.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "           metric_params=None, n_jobs=-1, n_neighbors=4, p=2,\n",
       "           weights='distance')"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn_clf.fit(X_train_expanded, y_train_expanded)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_knn_expanded_pred = knn_clf.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.97629999999999995"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "accuracy_score(y_test, y_knn_expanded_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.       ,  0.       ,  0.5053645,  0.       ,  0.       ,\n",
       "         0.       ,  0.       ,  0.4946355,  0.       ,  0.       ]])"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ambiguous_digit = X_test[2589]\n",
    "knn_clf.predict_proba([ambiguous_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nSUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7feeb157ada0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_digit(ambiguous_digit)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# Exercise solutions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. An MNIST Classifier With Over 97% Accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 6 candidates, totalling 30 fits\n",
      "[CV] n_neighbors=3, weights=uniform ..................................\n",
      "[CV]  n_neighbors=3, weights=uniform, score=0.9698458975426906, total= 9.6min\n",
      "[CV] n_neighbors=3, weights=uniform ..................................\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed: 47.8min remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  n_neighbors=3, weights=uniform, score=0.9714214297617064, total= 9.9min\n",
      "[CV] n_neighbors=3, weights=uniform ..................................\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   2 out of   2 | elapsed: 95.2min remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  n_neighbors=3, weights=uniform, score=0.9726666666666667, total= 9.5min\n",
      "[CV] n_neighbors=3, weights=uniform ..................................\n",
      "[CV]  n_neighbors=3, weights=uniform, score=0.9728265399683255, total= 9.6min\n",
      "[CV] n_neighbors=3, weights=uniform ..................................\n",
      "[CV]  n_neighbors=3, weights=uniform, score=0.9717405801933978, total= 9.6min\n",
      "[CV] n_neighbors=3, weights=distance .................................\n",
      "[CV]  n_neighbors=3, weights=distance, score=0.9712619741774261, total= 9.5min\n",
      "[CV] n_neighbors=3, weights=distance .................................\n",
      "[CV]  n_neighbors=3, weights=distance, score=0.9725879020163306, total= 9.5min\n",
      "[CV] n_neighbors=3, weights=distance .................................\n",
      "[CV] .... n_neighbors=3, weights=distance, score=0.9745, total= 9.5min\n",
      "[CV] n_neighbors=3, weights=distance .................................\n",
      "[CV]  n_neighbors=3, weights=distance, score=0.9743269150620989, total= 9.6min\n",
      "[CV] n_neighbors=3, weights=distance .................................\n",
      "[CV]  n_neighbors=3, weights=distance, score=0.9724074691563854, total= 9.4min\n",
      "[CV] n_neighbors=4, weights=uniform ..................................\n",
      "[CV]  n_neighbors=4, weights=uniform, score=0.9691795085381091, total= 9.7min\n",
      "[CV] n_neighbors=4, weights=uniform ..................................\n",
      "[CV]  n_neighbors=4, weights=uniform, score=0.9698383602732877, total= 9.4min\n",
      "[CV] n_neighbors=4, weights=uniform ..................................\n",
      "[CV]  n_neighbors=4, weights=uniform, score=0.9718333333333333, total= 9.1min\n",
      "[CV] n_neighbors=4, weights=uniform ..................................\n",
      "[CV]  n_neighbors=4, weights=uniform, score=0.9709093940151705, total= 9.2min\n",
      "[CV] n_neighbors=4, weights=uniform ..................................\n",
      "[CV]  n_neighbors=4, weights=uniform, score=0.9680726908969657, total= 9.3min\n",
      "[CV] n_neighbors=4, weights=distance .................................\n",
      "[CV]  n_neighbors=4, weights=distance, score=0.9714285714285714, total= 9.3min\n",
      "[CV] n_neighbors=4, weights=distance .................................\n",
      "[CV]  n_neighbors=4, weights=distance, score=0.9729211798033661, total= 9.3min\n",
      "[CV] n_neighbors=4, weights=distance .................................\n",
      "[CV]  n_neighbors=4, weights=distance, score=0.9745833333333334, total= 9.4min\n",
      "[CV] n_neighbors=4, weights=distance .................................\n",
      "[CV]  n_neighbors=4, weights=distance, score=0.9752438109527382, total= 9.3min\n",
      "[CV] n_neighbors=4, weights=distance .................................\n",
      "[CV]  n_neighbors=4, weights=distance, score=0.9720740246748917, total= 9.3min\n",
      "[CV] n_neighbors=5, weights=uniform ..................................\n",
      "[CV]  n_neighbors=5, weights=uniform, score=0.9693461057892545, total= 9.3min\n",
      "[CV] n_neighbors=5, weights=uniform ..................................\n",
      "[CV]  n_neighbors=5, weights=uniform, score=0.9699216797200466, total= 9.3min\n",
      "[CV] n_neighbors=5, weights=uniform ..................................\n",
      "[CV]  n_neighbors=5, weights=uniform, score=0.9726666666666667, total= 9.3min\n",
      "[CV] n_neighbors=5, weights=uniform ..................................\n",
      "[CV]  n_neighbors=5, weights=uniform, score=0.9713261648745519, total= 9.3min\n",
      "[CV] n_neighbors=5, weights=uniform ..................................\n",
      "[CV]  n_neighbors=5, weights=uniform, score=0.969406468822941, total= 9.3min\n",
      "[CV] n_neighbors=5, weights=distance .................................\n",
      "[CV]  n_neighbors=5, weights=distance, score=0.9711786755518534, total= 9.3min\n",
      "[CV] n_neighbors=5, weights=distance .................................\n",
      "[CV]  n_neighbors=5, weights=distance, score=0.9712547908681887, total= 9.3min\n",
      "[CV] n_neighbors=5, weights=distance .................................\n",
      "[CV]  n_neighbors=5, weights=distance, score=0.9738333333333333, total= 9.4min\n",
      "[CV] n_neighbors=5, weights=distance .................................\n",
      "[CV]  n_neighbors=5, weights=distance, score=0.9724931232808202, total= 9.3min\n",
      "[CV] n_neighbors=5, weights=distance .................................\n",
      "[CV]  n_neighbors=5, weights=distance, score=0.9714904968322774, total= 9.3min\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done  30 out of  30 | elapsed: 1399.4min finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "           metric_params=None, n_jobs=1, n_neighbors=5, p=2,\n",
       "           weights='uniform'),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid=[{'n_neighbors': [3, 4, 5], 'weights': ['uniform', 'distance']}],\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score=True,\n",
       "       scoring=None, verbose=3)"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "param_grid = [{'weights': [\"uniform\", \"distance\"], 'n_neighbors': [3, 4, 5]}]\n",
    "\n",
    "knn_clf = KNeighborsClassifier()\n",
    "grid_search = GridSearchCV(knn_clf, param_grid, cv=5, verbose=3, n_jobs=-1)\n",
    "grid_search.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'n_neighbors': 4, 'weights': 'distance'}"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grid_search.best_params_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.97324999999999995"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grid_search.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.97140000000000004"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "y_pred = grid_search.predict(X_test)\n",
    "accuracy_score(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. Data Augmentation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from scipy.ndimage.interpolation import shift"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def shift_image(image, dx, dy):\n",
    "    image = image.reshape((28, 28))\n",
    "    shifted_image = shift(image, [dy, dx], cval=0, mode=\"constant\")\n",
    "    return shifted_image.reshape([-1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqMAAADWCAYAAADl74szAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAH31JREFUeJzt3X+0HGWZ4PHvE8KPCGQiSQxEIVlkJBB/jdwgKKB7zC4b\nVhYxnlF+jTEysMxwDrj8hiQbJcqM484CR3CJqMkwKuJO3AX2BFdYAgdhHK/LgEYQDCaCQCYsEElM\nSGLe/aMq2Nx+O+nO7Xvrdvf3c06f3H7q7aq3cvu579PV9VZFSglJkiSpCqOq7oAkSZJ6l8WoJEmS\nKmMxKkmSpMpYjEqSJKkyFqOSJEmqjMWoJEmSKmMxOgJFxOqIuLjF16SI+Fib+7EwIn7WznVKw6WZ\nPBrYJiIOjIj/HREbI6Lt172LiJ9FxMIWX3NxRKxud1+kTtKJ+RwRcyJiQ4vrfENE/PeIWF+O61MH\n2c2OYDE6RCLizRGxOCKeiYgtEfGbiPhqRLyliZfPAG5scZMHAXe03lOp80TExIi4sRx8Xo2ItRFx\nT0T8mxZXNTDXLgYmA++myKkh+aAn6Q/M59eZC5wAHEfR56d35wBVpxlddQe6UUT8K+BB4FfAJ4En\ngbcCnwd+HBHHppRWZ163V0ppS0ppXavbTCk9P7heSx3lH4A3AJ8Gfgm8CfgAML6VlWRy7TDgJyml\nJ9vRSUlNMZ//4DDgsZTST3cEIqLC7gwPj4wOjRuA7cDMlNI9KaVfp5TuBWaW8RsAImJFRHwlIr4U\nEeuAH5bxgV81vC0i7ouIzRHxi4g4KSI2RMScmjavfdqLiKnl89kR8YOI+F1E/Lz2U2ZE7BERX4uI\nX0XEpoh4MiIujQjfExrRImIccDxweZlfa1JKP04pfSmldOuA5vtExE0R8dvyW4pLBqzrtVwrvwo/\nBfizMn+W1Hw9/t0ytrrmtSdHxE/KvPxVRHw+IvaqWf6miPifZX6tiYi5Te7fpRHxfJnjfwfsN2D5\nqIiYHxFPl0eRfhoRp9QsvzUi/lvN80Vl34+piT0dEWeWPy+JiDsj4oLyG5yXIuIbEfGGZvorDUa3\n53NmfxtuJyJWABcAJ5T9W1HGpgB/U8a68raZFh5tFhEHAP8OuCGl9LvaZeXzG4FZEfHGMnwmEBTJ\n+GeZ9Y0CvgdsA44B5gD/Gdi7ie58HrgeeBfwY+DWiNgxsI0CfgP8KXAEcBVwJfCpJndVqsqG8vEf\nImKfXbT9DPBT4D3AXwNfjIhjG7SdAdwN3Ebx9dgFZQzgz8vYDICIOBH4JvBlYDrFV2sfA75Qs74l\nFEc5ZgIfocjvqTvrbET8KbCIIsffA/wC+E8Dml0AXAJcBryD4u/Dsoh4d7l8BfDBmvYfBF7YEYuI\nw4C3lO12OB54e9nXjwOnltuRhlrX5vNATWzno8A3gIfK/n20fDwDfK6MHdTKNjtGSslHGx/Ae4EE\nnNpg+anl8qMpBoNHM21WAxeXP59IUYi+uWb5+8p1zKmJJeBj5c9Ty+fn1ix/cxk7bid9/yvg7prn\nC4GfVf1/6sPHwAcwG3gR2Ezxh/tLwHsHtFkNfHtA7Elg3oA2F9c8vxNYMuA1r+VWTex+YP6A2Eco\nBtUA3la+7v01y6cAvwcW7mS/HgS+OiB2N7C65vlvgAUD2qwA/r78eVq57YMovvp8laJw/X65/Gzg\nlzWvXQI8DexRE/tq7d8CHz6G8tHF+TwH2NDsdsrnXwZWZPb94kbb6YaHR0ar95NdLJ8GPJtS+k1N\n7McUX/fvyqM1Pz9b/vumHYGI+I8R0R8R66KY8fcZ4JAm1itVKqX0DxQTE04GllN8QPvHiLhyQNNH\nBzx/lpocGISjgKvKr9I3lPnzLWBf4ECKbxu2A/9U0+c1/CEPGzmCYjCu9drziBhLsd8/HNDmAeDI\ncjuPA89THAl9H7AK+A7w/ojYs4yvGPD6n6eUfl/zvF3/T9IudXE+t7qdnuUEpvb7JcUnqCMpvj4b\n6Mhy+S/L5xuHsC9bd/yQUkpRnAQ9CiAiPg5cSzHb8EHgt8BfUhy5lUa8lNJm4Afl43MRcTOwMCK+\nlFLaUjbbOvBltOf0pFHAZ4HvZpbVTqIYzvO7ard1H/CvgX8B7k0prY6IFyi+lvwAcMWA1w7V/5PU\nlB7J52a303MsRtsspfT/IuL7wF9ExH9NNeeNlhMC/hJYnlJ6MZqbIfc4MDkiJqeUdnwK62PwCXgc\n8KOU0pdr+vfWQa5TqtLPKf6m7QNs2UXbVmwF9hgQ+7/AtJTSLzPtiYjHKXL0aIoPe0TEIRRHf3bm\nMYpzw79eE3tt4lFK6bcR8SzwfuCemjbHUez/DiuAi4C1wHU1sT+n/nxRaSTqhnweaKfb2Ykt1Pe5\nq1iMDo3zKd6wd0fEPF5/aacolzfrBxSTGJaWswTHAH9LcR7pYD6lPQHMiYhZFEdpP0FxxOSlQaxT\nGnIRMZ7iyMLXKb62e4XiA9qlwD0ppd+2eZOrgQ9FxH3AqymllygmE9wZEWsoJkhso5gAdHRK6dKU\n0i8i4i7gpog4B9hEkbebdrGt64C/i4gfUxSMH6M4D/3FmjZ/Q3Hk6EmK03zOpJiA9J6aNiuAr1Cc\n17aiJvZVYFVK6ZnW/gukodHl+TzQTreziz4fHxF/X/b5hRa3O+L5NcwQSCmtokimlcAtwFMU54U8\nBsxIKf2qhXVtp/jqfG+K81WWUhS1ieJk7911E0UyfIviHNSpwH8ZxPqk4bIB+EeK2bH3UeTZFyje\nyx8fgu1dRPGV99PAwwAppe8D/76M/1P5uBz4dc3r5lBca/j/UNyQ4lsUg0pDKaXvUEwc/Hy5rXdQ\nDHq1rqcoSL8I/Izi78PslNIjNevZcd7oE+kP115cQXEAYkUzOy0Nk67N54Ga3E7OAuBgivO/u/Lr\n/B2zt9RBIuJdwD8DfSmlXU2AkiRJGrEsRjtARJxKMdHpSYojmH9L8XX/nyR/gZIkqYN5zmhn2J/i\nAr8HU5zTuQL4jIWoJEnqdB4ZlSRJUmWcwCRJkqTKtKUYjYgDIuJ7EbExItZExOntWK+k9jNfpc5h\nvqoXtOuc0RsoLso6CXg38L8i4pGU0spc4wkTJqSpU6e2adPS7lu9ejUvvPBCU3cf6CIt5SuYsxo5\nejBnzVd1rGbzddDFaETsC8wG3p5S2gA8EBG3A2dRXD+rztSpU+nv7x/spqVB6+vrq7oLw2p38hXM\nWY0cvZSz5qs6XbP52o6v6d8GbEspPVETewSY3oZ1S2ov81XqHOarekI7itH9gIG361pPcTmi10TE\nORHRHxH969Z15Q0EpE7QVL6COSuNAOarekI7itENwNgBsbEU95d9TUppcUqpL6XUN3HixDZsVtJu\naCpfwZyVRgDzVT2hHcXoE8DoiPjjmti7KO4vK2lkMV+lzmG+qicMuhhNKW0ElgGfi4h9I+L9wCnA\nLYNdt6T2Ml+lzmG+qle066L3fwGMAf4F+DZw3s4uOyGpUuar1DnMV3W9tlxnNKX0IvCRdqxL0tAy\nX6XOYb6qF3g7UEmSJFXGYlSSJEmVsRiVJElSZSxGJUmSVBmLUUmSJFXGYlSSJEmVsRiVJElSZSxG\nJUmSVBmLUUmSJFXGYlSSJEmVsRiVJElSZSxGJUmSVBmLUUmSJFXGYlSSJEmVsRiVJElSZSxGJUmS\nVBmLUUmSJFXGYlSSJEmVsRiVJElSZUa3YyURsQI4BthWhn6TUjq8HevWyLJ9+/Zs/KmnnsrGDzvs\nsKHsjnaD+Sp1DvO1Oo53w6edR0bPTyntVz5MFGlkM1+lzmG+qqv5Nb0kSZIq085i9JqIeCEifhgR\nH2zjeiW1n/kqdQ7zVV2tXcXoZcChwJuBxcAdEfHW2gYRcU5E9EdE/7p169q0WUm7YZf5CuasNEKY\nr+p6bSlGU0o/Sim9klJ6NaW0FPghcNKANotTSn0ppb6JEye2Y7OSdkMz+Vq2M2elipmv6gVtmU2f\nkYAYonWrtHbt2mz8pptuysZvvPHGIevLrFmzsvH58+dn44ceeuiQ9UUtM1+lztGT+drKeDeUYx04\n3g2FQR8ZjYhxEXFiROwTEaMj4gzgBOCuwXdPUjuZr1LnMF/VK9pxZHRPYBEwDfg98DjwkZTSE21Y\nt6T2Ml+lzmG+qicMuhhNKa0DZrShL5KGmPkqdQ7zVb3C64xKkiSpMhajkiRJqsxQzaZXafPmzXWx\nxx57rKV13H777dn44sWLs/HnnnuupfW3w9KlS7PxO+64IxtvdG/fsWPHtq1PkqThkRvrwPEO8uOd\nY93reWRUkiRJlbEYlSRJUmUsRiVJklQZi1FJkiRVxmJUkiRJlXE2fZs88MAD2fjll19eF3vwwQfb\nss2ZM2dm45/+9Kez8bPOOqvpdb/44ovZ+LHHHtv0OgAuuOCCbPwNb3hDS+uRJFWvlbEOqhnvWhnr\nwPFuJPDIqCRJkipjMSpJkqTKWIxKkiSpMhajkiRJqozFqCRJkirjbPoGGs2uu/rqq7PxJUuWZOPr\n16+vi02ePDnb9sILL8zGjz/++Gz86KOPzsYjIhtvZNu2bXWxO++8s6V1jB8/Phu/7LLLsvHRo33r\nSdJI0Mp418pYByNrvMuNdeB4NxJ4ZFSSJEmVsRiVJElSZSxGJUmSVBmLUUmSJFWmqWI0Is6PiP6I\neDUilgxY9qGIeDwifhcR90bElCHpqaSmmK9S5zBfpeZn0z8LLAJOBMbsCEbEBGAZcDZwB3A18B3g\nmPZ2c/g1mi3X6kz1ww8/vC720EMPZduOGzeupXW3y/PPP18Xu+iii1paxzXXXJON77XXXrvVJw1K\nz+WrGtu+fXs2/tRTT2Xjhx122FB2R/Uqz9d2jHe5sQ5G1niXG+vA8W4kaKoYTSktA4iIPuAtNYs+\nCqxMKX23XL4QeCEipqWUHm9zXyU1wXyVOof5Kg3+nNHpwCM7nqSUNgKryrikkcV8lTqH+aqeMdhi\ndD9g4JVu1wP7D2wYEeeU58X0r1u3bpCblbQbms5XMGelipmv6hmDLUY3AGMHxMYCrwxsmFJanFLq\nSyn1TZw4cZCblbQbms5XMGelipmv6hmDvUfVSuCTO55ExL7AW8t4RzvttNOy8VtvvbWl9WzevLku\ntnz58pa2OdTuvvvuptvOmTMnGz/77LPb1BsNoa7N106xdu3abPymm27Kxm+88cYh68usWbOy8fnz\n52fjhx566JD1RVnDlq/tGO9yYx2MrPGulbEOHO+GU7OXdhodEfsAewB7RMQ+ETEa+B7w9oiYXS5f\nADzqydVSdcxXqXOYr1LzX9PPAzYBlwNnlj/PSymtA2YDnwdeAt4LfGII+impeear1DnMV/W8Zi/t\ntBBY2GDZ3cC09nVJ0mCYr1LnMF8lbwcqSZKkClmMSpIkqTKDnU3ftRrNKG10a73bbrstG1+zZk1d\n7Mwzz8y2ffDBB7PxE044IRufPXt2Nj5qVP4zxv3335+NX3vttXWxe++9N9v2+OOPz8albpGbFfzY\nY4+1tI7bb789G1+8eHE2/txzz7W0/nZYunRpNn7HHXdk441uHzp27MCrD6nTtDLetTLWQTXjXStj\nHTjejQQeGZUkSVJlLEYlSZJUGYtRSZIkVcZiVJIkSZWxGJUkSVJlIqU07Bvt6+tL/f39w77ddti6\ndWs2/sUvfjEbX7my/jbCrd7fvpFGs1unTp2ajW/cuDEbf+WVV+pijzzySLbtmDFjmutc6dxzz83G\nN23a1NJ6WunL3Llzs/FLLrmkLtbX10d/f38MujNdrpNztpEHHnggG7/88svrYo1m/rZq5syZ2fgx\nxxyTjZ911llNr/vFF1/Mxo899tim1wHw2c9+Nhu/4oorsvHRo4f3oizm7K61K19z410rYx1UM961\nMtZB74x3VWg2Xz0yKkmSpMpYjEqSJKkyFqOSJEmqjMWoJEmSKmMxKkmSpMp4b/oW7bnnntn4VVdd\nlY1v2bKlLrZgwYJs25NOOikbX716dTbeaJZso1mvje4p/OEPf7guduWVV2bbtsvJJ5+cjb/zne/M\nxs8777y6WO6exAAHHnjg7ndMHavRbPKrr746G1+yZEk2vn79+rrY5MmTs20vvPDCbLzRPa2PPvro\nbDyitcnh27Ztq4vdeeedLa1j/Pjx2fhll12WjQ/3rHlVLzfetTLWQTXjXStjHVQz3rUy1kH3j3ce\nGZUkSVJlLEYlSZJUGYtRSZIkVcZiVJIkSZVpqhiNiPMjoj8iXo2IJTXxqRGRImJDzWP+kPVW0i6Z\nr1LnMF+l5mfTPwssAk4EcjdIHZdSqp/eKfbaa6+62LRp07JtTz/99Gz8C1/4Qja+du3abLzRDN9G\nWrnv9pQpU7Lxgw8+OBu//vrrs/Hp06dn442uVqCW9GS+Npod3upM9cMPP7wu9tBDD2Xbjhs3rqV1\nt8vzzz9fF7voootaWsc111yTjef+ZmlIdUW+NnrfjKTxrpWxDoZ2vHOse72mitGU0jKAiOgD3jKk\nPZI0KOar1DnMV6l954yuiYhnIuIbETGhTeuUNDTMV6lzmK/qeoMtRl8AZgBTgKOA/YFv5hpGxDnl\neTH969atG+RmJe2GpvMVzFmpYuaresagitGU0oaUUn9KaVtKaS1wPvBvI2L/TNvFKaW+lFLfxIkT\nB7NZSbuhlXwt25uzUkXMV/WSdl/aKQ3ReiW1n/kqdQ7zVV2rqQlMETG6bLsHsEdE7ANso/jq4GXg\nSeCNwPXAipRS/c2d9Zrt27dn4xs2bBjmnhQmTZpUF2s0M3fOnDnZ+IQJnso0UvRqvp522mnZ+K23\n3trSejZv3lwXW758eUvbHGp33313020b5ezZZ5/dpt5oMLo9X0fSeJcb68DxbiRo9hPWPGATcDlw\nZvnzPOBQ4C7gFeBnwKtANX+dJe1gvkqdw3xVz2v20k4LgYUNFn+7XZ2RNHjmq9Q5zFfJc08kSZJU\nIYtRSZIkVcZiVJIkSZVp9t702oVGMwZfeumlulije+82uq/tULvnnnvqYkceeWQFPZF23/z587Px\nRrl52223ZeNr1qypi5155pnZto3udX3CCSdk47Nnz87GR43KHxe4//77s/Frr722Lnbvvfdm2x5/\n/PHZuLQ7WhnrYGSNd7mxDhzvRgKPjEqSJKkyFqOSJEmqjMWoJEmSKmMxKkmSpMo4galNGp2kvWDB\ngmHuidSbjjjiiGz8lltuycbf8Y53ZOMrV66sizW6pegNN9zQUvypp57KxqdOnZqNH3XUUdn4XXfd\nVRd75JFHsm0feOCBbLyRc889NxvftGlTS+vJGTNmTDY+d+7cbPySSy4Z9DbVXo51GgoeGZUkSVJl\nLEYlSZJUGYtRSZIkVcZiVJIkSZWxGJUkSVJlnE3fonXr1mXjixcvHvS6TznllGz8yiuvzMaPO+64\nbHzr1q2D7ovULfbcc89s/KqrrsrGt2zZUhdrNFP4pJNOysZXr16djR977LHZ+BVXXJGNN7pl6Yc/\n/OG6WKO/E+1y8sknZ+PvfOc7s/HzzjuvLtbotqcHHnjg7ndMQyY33rVjrAPHO72eR0YlSZJUGYtR\nSZIkVcZiVJIkSZWxGJUkSVJlLEYlSZJUmV3Opo+IvYEbgZnAAcAq4IqU0vJy+YeAG4BDgB8Bc1JK\na4asxxW7+eabs/Fnnnmm6XWceOKJ2fiiRYuy8enTpze97p056KCDsvFx48a1Zf2qnvk6eHvttVdd\nbNq0adm2p59+ejbe6P7da9euzcYvvPDCJntXePDBB5tuO2XKlGz84IMPzsavv/76bLzR36FGVytQ\nc0ZyzubGu1bGOqhmvHOs6zzNHBkdDTwNfAD4I2AecFtETI2ICcAyYD5FEvUD3xmivkraNfNV6izm\nrHreLo+MppQ2AgtrQndGxK+Ao4DxwMqU0ncBImIh8EJETEspPd7+7kraGfNV6izmrLQb54xGxCTg\nbcBKYDrwyI5lZVKtKuMDX3dORPRHRH+jC8dLaq/dzdfyteasNMwcY9WLWipGI2JP4JvA0vJT2X7A\n+gHN1gP7D3xtSmlxSqkvpdQ3ceLE3e2vpCYNJl/BnJWGm2OselXTxWhEjAJuAbYA55fhDcDYAU3H\nAq+0pXeSdov5KnUWc1a9rKl700dEAF8DJgEnpZR23Ax2JfDJmnb7Am8t413puuuua6n9jBkz6mLL\nli3Lth0zZkw2/vLLL2fjKaWW+jJ37txsfPLkyS2tRyOb+dp+27dvz8Y3bNgwzD0pTJo0qS520UUX\nZdvOmTMnG58wYUI7u6RBGKk528p4lxvroJrxzrGu8zR7ZPQrwBHAySmlTTXx7wFvj4jZEbEPsAB4\n1BOrpUqZr1JnMWfV03ZZjEbEFOBc4N3A8xGxoXyckVJaB8wGPg+8BLwX+MRQdlhSY+ar1FnMWam5\nSzutAWIny+8G8leEljSszFeps5izkrcDlSRJUoUsRiVJklSZpmbT6w8uvvjibPzSSy/NxletWlUX\ne/jhh7NtDznkkGx81qxZ2fi2bduy8VNPPTUbnzdvXjYu9aJGM+Rfeumlulije803uo/7ULvnnnvq\nYkceeWQFPVE3y413rYx1UM1451jXeTwyKkmSpMpYjEqSJKkyFqOSJEmqjMWoJEmSKmMxKkmSpMo4\nm75Fn/rUp7LxpUuXZuMrV9bfQvi4445rS19y96eGxjMJ995777ZsV+oGjWbIL1iwYJh7Io1MufGu\nlbEOqhnvHOs6j0dGJUmSVBmLUUmSJFXGYlSSJEmVsRiVJElSZSxGJUmSVBln07do/Pjx2fh9992X\njS9fvnzI+nLaaadl46NG+RlD2mHdunXZ+OLFiwe97lNOOSUbv/LKK7PxRjOLt27dOui+SO2WG++q\nGOvA8a7b+VuUJElSZSxGJUmSVBmLUUmSJFXGYlSSJEmV2eUEpojYG7gRmAkcAKwCrkgpLY+IqcCv\ngI01L/nrlNLV7e/qyHbAAQdk42ecccYw90S9zHytd/PNN2fjzzzzTNPrOPHEE7PxRYsWZePTp09v\net07c9BBB2Xj48aNa8v6Vb1Oy1nHOg2FZmbTjwaeBj4A/Bo4CbgtIt5R02ZcSmnbEPRPUmvMV6mz\nmLPqebv8mj6ltDGltDCltDqltD2ldCfFJ7Wjhr57klphvkqdxZyVduOc0YiYBLwNWFkTXhMRz0TE\nNyJiQoPXnRMR/RHR3+i6f5Laa3fztXytOSsNM8dY9aKWitGI2BP4JrA0pfQ48AIwA5hC8Slu/3J5\nnZTS4pRSX0qpb+LEiYPrtaRdGky+gjkrDTfHWPWqpu/AFBGjgFuALcD5ACmlDUB/2WRtRJwPPBcR\n+6eUXml3ZyU1x3yVOos5q17WVDEaEQF8DZgEnJRSanTvulT+6yWjpIqYr6933XXXtdR+xowZdbFl\ny5Zl244ZMyYbf/nll7PxlFI23sjcuXOz8cmTJ7e0Ho1s5qx6XbNHRr8CHAHMTClt2hGMiPcCLwNP\nAm8ErgdWpJTWt7ujkppmvkqdxZxVT9vlp6uImAKcC7wbeD4iNpSPM4BDgbuAV4CfAa8Cpw1hfyXt\nhPkqdRZzVmriyGhKaQ0QO2ny7fZ1R9JgmK9SZzFnJc87kSRJUoUsRiVJklSZpi/tJEmd6OKLL87G\nL7300mx81apVdbGHH3442/aQQw7JxmfNmpWNb9uWv6Pjqaeemo3PmzcvG5ekbuKRUUmSJFXGYlSS\nJEmVsRiVJElSZSxGJUmSVBmLUUmSJFUmWr1Xcls2GrEOWFM+nQC8MOydGH69sp/QWfs6JaU0sepO\njHTmbFfrtP00Z3fBfO1qnbafTeVrJcXo6zoQ0Z9S6qu0E8OgV/YTemtfe1Gv/H7dT3WDXvn9up+d\nza/pJUmSVBmLUUmSJFVmJBSji6vuwDDplf2E3trXXtQrv1/3U92gV36/7mcHq/ycUUmSJPWukXBk\nVJIkST3KYlSSJEmVqawYjYgDIuJ7EbExItZExOlV9aWdIuL8iOiPiFcjYsmAZR+KiMcj4ncRcW9E\nTKmom4MWEXtHxNfK390rEfHPETGrZnnX7KsK5mznvo/N195jvnb2+7jXcrbKI6M3AFuAScAZwFci\nYnqF/WmXZ4FFwNdrgxExAVgGzAcOAPqB7wx779pnNPA08AHgj4B5wG0RMbUL91UFc7Zz38fma+8x\nXzv7fdxTOVvVHZj2BV4C3p5SeqKM3QL8JqV0+bB3aAhExCLgLSmlOeXzc4A5KaX3lc/3pbiLwp+k\nlB6vrKNtFBGPAp8FxtPl+9przNnuex+br93LfO3O93E352xVR0bfBmzbkSSlR4Bu+NTWyHSKfQQg\npbQRWEWX7HNETKL4va6ky/e1R5mzXfQ+Nl+7nvnaZe/jbs/ZqorR/YDfDoitB/avoC/DZT+KfazV\nFfscEXsC3wSWlp/KunZfe5g5W+j4fTZfe4L5WuiKfe6FnK2qGN0AjB0QGwu8UkFfhktX7nNEjAJu\noTg36fwy3JX72uN68XfadftsvvaMXvydduU+90rOVlWMPgGMjog/rom9i+Lwc7daSbGPwGvneLyV\nDt7niAjgaxQnyM9OKW0tF3Xdvsqc7fT3sfnaU8zXLngf91LOVlKMluc3LAM+FxH7RsT7gVMoqv+O\nFhGjI2IfYA9gj4jYJyJGA98D3h4Rs8vlC4BHO/Vk49JXgCOAk1NKm2ri3bivPc2c7Yr3sfnaI8zX\nrnkf907OppQqeVBcjuB/ABuBXwOnV9WXNu/XQiANeCwsl80EHgc2ASuAqVX3dxD7OaXct80UXxns\neJzRbfvq47XfuTnboe9j87X3HuZrZ7+Pey1nvTe9JEmSKuPtQCVJklQZi1FJkiRVxmJUkiRJlbEY\nlSRJUmUsRiVJklQZi1FJkiRVxmJUkiRJlbEYlSRJUmUsRiVJklSZ/w8/En7HmA1nlQAAAABJRU5E\nrkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7feed40e0e10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "image = X_train[1000]\n",
    "shifted_image_down = shift_image(image, 0, 5)\n",
    "shifted_image_left = shift_image(image, -5, 0)\n",
    "\n",
    "plt.figure(figsize=(12,3))\n",
    "plt.subplot(131)\n",
    "plt.title(\"Original\", fontsize=14)\n",
    "plt.imshow(image.reshape(28, 28), interpolation=\"nearest\", cmap=\"Greys\")\n",
    "plt.subplot(132)\n",
    "plt.title(\"Shifted down\", fontsize=14)\n",
    "plt.imshow(shifted_image_down.reshape(28, 28), interpolation=\"nearest\", cmap=\"Greys\")\n",
    "plt.subplot(133)\n",
    "plt.title(\"Shifted left\", fontsize=14)\n",
    "plt.imshow(shifted_image_left.reshape(28, 28), interpolation=\"nearest\", cmap=\"Greys\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X_train_augmented = [image for image in X_train]\n",
    "y_train_augmented = [label for label in y_train]\n",
    "\n",
    "for dx, dy in ((1, 0), (-1, 0), (0, 1), (0, -1)):\n",
    "    for image, label in zip(X_train, y_train):\n",
    "        X_train_augmented.append(shift_image(image, dx, dy))\n",
    "        y_train_augmented.append(label)\n",
    "\n",
    "X_train_augmented = np.array(X_train_augmented)\n",
    "y_train_augmented = np.array(y_train_augmented)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "shuffle_idx = np.random.permutation(len(X_train_augmented))\n",
    "X_train_augmented = X_train_augmented[shuffle_idx]\n",
    "y_train_augmented = y_train_augmented[shuffle_idx]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "knn_clf = KNeighborsClassifier(**grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "           metric_params=None, n_jobs=1, n_neighbors=4, p=2,\n",
       "           weights='distance')"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn_clf.fit(X_train_augmented, y_train_augmented)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.97629999999999995"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred = knn_clf.predict(X_test)\n",
    "accuracy_score(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "By simply augmenting the data, we got a 0.5% accuracy boost. :)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. Tackle the Titanic dataset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The goal is to predict whether or not a passenger survived based on attributes such as their age, sex, passenger class, where they embarked and so on."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's load the data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "TITANIC_PATH = os.path.join(\"datasets\", \"titanic\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "\n",
    "def load_titanic_data(filename, titanic_path=TITANIC_PATH):\n",
    "    csv_path = os.path.join(titanic_path, filename)\n",
    "    return pd.read_csv(csv_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "train_data = load_titanic_data(\"train.csv\")\n",
    "test_data = load_titanic_data(\"test.csv\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The data is already split into a training set and a test set. However, the test data does *not* contain the labels: your goal is to train the best model you can using the training data, then make your predictions on the test data and upload them to Kaggle to see your final score."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's take a peek at the top few rows of the training set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Name</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Ticket</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Cabin</th>\n",
       "      <th>Embarked</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Braund, Mr. Owen Harris</td>\n",
       "      <td>male</td>\n",
       "      <td>22.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>A/5 21171</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n",
       "      <td>female</td>\n",
       "      <td>38.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>PC 17599</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C85</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>Heikkinen, Miss. Laina</td>\n",
       "      <td>female</td>\n",
       "      <td>26.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>STON/O2. 3101282</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Futrelle, Mrs. Jacques Heath (Lily May Peel)</td>\n",
       "      <td>female</td>\n",
       "      <td>35.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>113803</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>C123</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Allen, Mr. William Henry</td>\n",
       "      <td>male</td>\n",
       "      <td>35.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>373450</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Survived  Pclass  \\\n",
       "0            1         0       3   \n",
       "1            2         1       1   \n",
       "2            3         1       3   \n",
       "3            4         1       1   \n",
       "4            5         0       3   \n",
       "\n",
       "                                                Name     Sex   Age  SibSp  \\\n",
       "0                            Braund, Mr. Owen Harris    male  22.0      1   \n",
       "1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1   \n",
       "2                             Heikkinen, Miss. Laina  female  26.0      0   \n",
       "3       Futrelle, Mrs. Jacques Heath (Lily May Peel)  female  35.0      1   \n",
       "4                           Allen, Mr. William Henry    male  35.0      0   \n",
       "\n",
       "   Parch            Ticket     Fare Cabin Embarked  \n",
       "0      0         A/5 21171   7.2500   NaN        S  \n",
       "1      0          PC 17599  71.2833   C85        C  \n",
       "2      0  STON/O2. 3101282   7.9250   NaN        S  \n",
       "3      0            113803  53.1000  C123        S  \n",
       "4      0            373450   8.0500   NaN        S  "
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The attributes have the following meaning:\n",
    "* **Survived**: that's the target, 0 means the passenger did not survive, while 1 means he/she survived.\n",
    "* **Pclass**: passenger class.\n",
    "* **Name**, **Sex**, **Age**: self-explanatory\n",
    "* **SibSp**: how many siblings & spouses of the passenger aboard the Titanic.\n",
    "* **Parch**: how many children & parents of the passenger aboard the Titanic.\n",
    "* **Ticket**: ticket id\n",
    "* **Fare**: price paid (in pounds)\n",
    "* **Cabin**: passenger's cabin number\n",
    "* **Embarked**: where the passenger embarked the Titanic"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's get more info to see how much data is missing:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 891 entries, 0 to 890\n",
      "Data columns (total 12 columns):\n",
      "PassengerId    891 non-null int64\n",
      "Survived       891 non-null int64\n",
      "Pclass         891 non-null int64\n",
      "Name           891 non-null object\n",
      "Sex            891 non-null object\n",
      "Age            714 non-null float64\n",
      "SibSp          891 non-null int64\n",
      "Parch          891 non-null int64\n",
      "Ticket         891 non-null object\n",
      "Fare           891 non-null float64\n",
      "Cabin          204 non-null object\n",
      "Embarked       889 non-null object\n",
      "dtypes: float64(2), int64(5), object(5)\n",
      "memory usage: 83.6+ KB\n"
     ]
    }
   ],
   "source": [
    "train_data.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Okay, the **Age**, **Cabin** and **Embarked** attributes are sometimes null (less than 891 non-null), especially the **Cabin** (77% are null). We will ignore the **Cabin** for now and focus on the rest. The **Age** attribute has about 19% null values, so we will need to decide what to do with them. Replacing null values with the median age seems reasonable."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The **Name** and **Ticket** attributes may have some value, but they will be a bit tricky to convert into useful numbers that a model can consume. So for now, we will ignore them."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's take a look at the numerical attributes:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Fare</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>714.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>446.000000</td>\n",
       "      <td>0.383838</td>\n",
       "      <td>2.308642</td>\n",
       "      <td>29.699118</td>\n",
       "      <td>0.523008</td>\n",
       "      <td>0.381594</td>\n",
       "      <td>32.204208</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>257.353842</td>\n",
       "      <td>0.486592</td>\n",
       "      <td>0.836071</td>\n",
       "      <td>14.526497</td>\n",
       "      <td>1.102743</td>\n",
       "      <td>0.806057</td>\n",
       "      <td>49.693429</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.420000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>223.500000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>20.125000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>7.910400</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>446.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>28.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>14.454200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>668.500000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>38.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>31.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>891.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>8.000000</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>512.329200</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       PassengerId    Survived      Pclass         Age       SibSp  \\\n",
       "count   891.000000  891.000000  891.000000  714.000000  891.000000   \n",
       "mean    446.000000    0.383838    2.308642   29.699118    0.523008   \n",
       "std     257.353842    0.486592    0.836071   14.526497    1.102743   \n",
       "min       1.000000    0.000000    1.000000    0.420000    0.000000   \n",
       "25%     223.500000    0.000000    2.000000   20.125000    0.000000   \n",
       "50%     446.000000    0.000000    3.000000   28.000000    0.000000   \n",
       "75%     668.500000    1.000000    3.000000   38.000000    1.000000   \n",
       "max     891.000000    1.000000    3.000000   80.000000    8.000000   \n",
       "\n",
       "            Parch        Fare  \n",
       "count  891.000000  891.000000  \n",
       "mean     0.381594   32.204208  \n",
       "std      0.806057   49.693429  \n",
       "min      0.000000    0.000000  \n",
       "25%      0.000000    7.910400  \n",
       "50%      0.000000   14.454200  \n",
       "75%      0.000000   31.000000  \n",
       "max      6.000000  512.329200  "
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* Yikes, only 38% **Survived**. :(  That's close enough to 40%, so accuracy will be a reasonable metric to evaluate our model.\n",
    "* The mean **Fare** was £32.20, which does not seem so expensive (but it was probably a lot of money back then).\n",
    "* The mean **Age** was less than 30 years old."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's check that the target is indeed 0 or 1:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    549\n",
       "1    342\n",
       "Name: Survived, dtype: int64"
      ]
     },
     "execution_count": 106,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data[\"Survived\"].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's take a quick look at all the categorical attributes:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3    491\n",
       "1    216\n",
       "2    184\n",
       "Name: Pclass, dtype: int64"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data[\"Pclass\"].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "male      577\n",
       "female    314\n",
       "Name: Sex, dtype: int64"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data[\"Sex\"].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "S    644\n",
       "C    168\n",
       "Q     77\n",
       "Name: Embarked, dtype: int64"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data[\"Embarked\"].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The Embarked attribute tells us where the passenger embarked: C=Cherbourg, Q=Queenstown, S=Southampton."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `CategoricalEncoder` class will allow us to convert categorical attributes to one-hot vectors. It will soon be added to Scikit-Learn, and in the meantime you can use the code below (copied from Pull Request #9151)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Definition of the CategoricalEncoder class, copied from PR #9151.\n",
    "# Just run this cell, or copy it to your code, no need to try to\n",
    "# understand every line.\n",
    "\n",
    "from sklearn.base import BaseEstimator, TransformerMixin\n",
    "from sklearn.utils import check_array\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "from scipy import sparse\n",
    "\n",
    "class CategoricalEncoder(BaseEstimator, TransformerMixin):\n",
    "    \"\"\"Encode categorical features as a numeric array.\n",
    "    The input to this transformer should be a matrix of integers or strings,\n",
    "    denoting the values taken on by categorical (discrete) features.\n",
    "    The features can be encoded using a one-hot aka one-of-K scheme\n",
    "    (``encoding='onehot'``, the default) or converted to ordinal integers\n",
    "    (``encoding='ordinal'``).\n",
    "    This encoding is needed for feeding categorical data to many scikit-learn\n",
    "    estimators, notably linear models and SVMs with the standard kernels.\n",
    "    Read more in the :ref:`User Guide <preprocessing_categorical_features>`.\n",
    "    Parameters\n",
    "    ----------\n",
    "    encoding : str, 'onehot', 'onehot-dense' or 'ordinal'\n",
    "        The type of encoding to use (default is 'onehot'):\n",
    "        - 'onehot': encode the features using a one-hot aka one-of-K scheme\n",
    "          (or also called 'dummy' encoding). This creates a binary column for\n",
    "          each category and returns a sparse matrix.\n",
    "        - 'onehot-dense': the same as 'onehot' but returns a dense array\n",
    "          instead of a sparse matrix.\n",
    "        - 'ordinal': encode the features as ordinal integers. This results in\n",
    "          a single column of integers (0 to n_categories - 1) per feature.\n",
    "    categories : 'auto' or a list of lists/arrays of values.\n",
    "        Categories (unique values) per feature:\n",
    "        - 'auto' : Determine categories automatically from the training data.\n",
    "        - list : ``categories[i]`` holds the categories expected in the ith\n",
    "          column. The passed categories are sorted before encoding the data\n",
    "          (used categories can be found in the ``categories_`` attribute).\n",
    "    dtype : number type, default np.float64\n",
    "        Desired dtype of output.\n",
    "    handle_unknown : 'error' (default) or 'ignore'\n",
    "        Whether to raise an error or ignore if a unknown categorical feature is\n",
    "        present during transform (default is to raise). When this is parameter\n",
    "        is set to 'ignore' and an unknown category is encountered during\n",
    "        transform, the resulting one-hot encoded columns for this feature\n",
    "        will be all zeros.\n",
    "        Ignoring unknown categories is not supported for\n",
    "        ``encoding='ordinal'``.\n",
    "    Attributes\n",
    "    ----------\n",
    "    categories_ : list of arrays\n",
    "        The categories of each feature determined during fitting. When\n",
    "        categories were specified manually, this holds the sorted categories\n",
    "        (in order corresponding with output of `transform`).\n",
    "    Examples\n",
    "    --------\n",
    "    Given a dataset with three features and two samples, we let the encoder\n",
    "    find the maximum value per feature and transform the data to a binary\n",
    "    one-hot encoding.\n",
    "    >>> from sklearn.preprocessing import CategoricalEncoder\n",
    "    >>> enc = CategoricalEncoder(handle_unknown='ignore')\n",
    "    >>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])\n",
    "    ... # doctest: +ELLIPSIS\n",
    "    CategoricalEncoder(categories='auto', dtype=<... 'numpy.float64'>,\n",
    "              encoding='onehot', handle_unknown='ignore')\n",
    "    >>> enc.transform([[0, 1, 1], [1, 0, 4]]).toarray()\n",
    "    array([[ 1.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.],\n",
    "           [ 0.,  1.,  1.,  0.,  0.,  0.,  0.,  0.,  0.]])\n",
    "    See also\n",
    "    --------\n",
    "    sklearn.preprocessing.OneHotEncoder : performs a one-hot encoding of\n",
    "      integer ordinal features. The ``OneHotEncoder assumes`` that input\n",
    "      features take on values in the range ``[0, max(feature)]`` instead of\n",
    "      using the unique values.\n",
    "    sklearn.feature_extraction.DictVectorizer : performs a one-hot encoding of\n",
    "      dictionary items (also handles string-valued features).\n",
    "    sklearn.feature_extraction.FeatureHasher : performs an approximate one-hot\n",
    "      encoding of dictionary items or strings.\n",
    "    \"\"\"\n",
    "\n",
    "    def __init__(self, encoding='onehot', categories='auto', dtype=np.float64,\n",
    "                 handle_unknown='error'):\n",
    "        self.encoding = encoding\n",
    "        self.categories = categories\n",
    "        self.dtype = dtype\n",
    "        self.handle_unknown = handle_unknown\n",
    "\n",
    "    def fit(self, X, y=None):\n",
    "        \"\"\"Fit the CategoricalEncoder to X.\n",
    "        Parameters\n",
    "        ----------\n",
    "        X : array-like, shape [n_samples, n_feature]\n",
    "            The data to determine the categories of each feature.\n",
    "        Returns\n",
    "        -------\n",
    "        self\n",
    "        \"\"\"\n",
    "\n",
    "        if self.encoding not in ['onehot', 'onehot-dense', 'ordinal']:\n",
    "            template = (\"encoding should be either 'onehot', 'onehot-dense' \"\n",
    "                        \"or 'ordinal', got %s\")\n",
    "            raise ValueError(template % self.handle_unknown)\n",
    "\n",
    "        if self.handle_unknown not in ['error', 'ignore']:\n",
    "            template = (\"handle_unknown should be either 'error' or \"\n",
    "                        \"'ignore', got %s\")\n",
    "            raise ValueError(template % self.handle_unknown)\n",
    "\n",
    "        if self.encoding == 'ordinal' and self.handle_unknown == 'ignore':\n",
    "            raise ValueError(\"handle_unknown='ignore' is not supported for\"\n",
    "                             \" encoding='ordinal'\")\n",
    "\n",
    "        X = check_array(X, dtype=np.object, accept_sparse='csc', copy=True)\n",
    "        n_samples, n_features = X.shape\n",
    "\n",
    "        self._label_encoders_ = [LabelEncoder() for _ in range(n_features)]\n",
    "\n",
    "        for i in range(n_features):\n",
    "            le = self._label_encoders_[i]\n",
    "            Xi = X[:, i]\n",
    "            if self.categories == 'auto':\n",
    "                le.fit(Xi)\n",
    "            else:\n",
    "                valid_mask = np.in1d(Xi, self.categories[i])\n",
    "                if not np.all(valid_mask):\n",
    "                    if self.handle_unknown == 'error':\n",
    "                        diff = np.unique(Xi[~valid_mask])\n",
    "                        msg = (\"Found unknown categories {0} in column {1}\"\n",
    "                               \" during fit\".format(diff, i))\n",
    "                        raise ValueError(msg)\n",
    "                le.classes_ = np.array(np.sort(self.categories[i]))\n",
    "\n",
    "        self.categories_ = [le.classes_ for le in self._label_encoders_]\n",
    "\n",
    "        return self\n",
    "\n",
    "    def transform(self, X):\n",
    "        \"\"\"Transform X using one-hot encoding.\n",
    "        Parameters\n",
    "        ----------\n",
    "        X : array-like, shape [n_samples, n_features]\n",
    "            The data to encode.\n",
    "        Returns\n",
    "        -------\n",
    "        X_out : sparse matrix or a 2-d array\n",
    "            Transformed input.\n",
    "        \"\"\"\n",
    "        X = check_array(X, accept_sparse='csc', dtype=np.object, copy=True)\n",
    "        n_samples, n_features = X.shape\n",
    "        X_int = np.zeros_like(X, dtype=np.int)\n",
    "        X_mask = np.ones_like(X, dtype=np.bool)\n",
    "\n",
    "        for i in range(n_features):\n",
    "            valid_mask = np.in1d(X[:, i], self.categories_[i])\n",
    "\n",
    "            if not np.all(valid_mask):\n",
    "                if self.handle_unknown == 'error':\n",
    "                    diff = np.unique(X[~valid_mask, i])\n",
    "                    msg = (\"Found unknown categories {0} in column {1}\"\n",
    "                           \" during transform\".format(diff, i))\n",
    "                    raise ValueError(msg)\n",
    "                else:\n",
    "                    # Set the problematic rows to an acceptable value and\n",
    "                    # continue `The rows are marked `X_mask` and will be\n",
    "                    # removed later.\n",
    "                    X_mask[:, i] = valid_mask\n",
    "                    X[:, i][~valid_mask] = self.categories_[i][0]\n",
    "            X_int[:, i] = self._label_encoders_[i].transform(X[:, i])\n",
    "\n",
    "        if self.encoding == 'ordinal':\n",
    "            return X_int.astype(self.dtype, copy=False)\n",
    "\n",
    "        mask = X_mask.ravel()\n",
    "        n_values = [cats.shape[0] for cats in self.categories_]\n",
    "        n_values = np.array([0] + n_values)\n",
    "        indices = np.cumsum(n_values)\n",
    "\n",
    "        column_indices = (X_int + indices[:-1]).ravel()[mask]\n",
    "        row_indices = np.repeat(np.arange(n_samples, dtype=np.int32),\n",
    "                                n_features)[mask]\n",
    "        data = np.ones(n_samples * n_features)[mask]\n",
    "\n",
    "        out = sparse.csc_matrix((data, (row_indices, column_indices)),\n",
    "                                shape=(n_samples, indices[-1]),\n",
    "                                dtype=self.dtype).tocsr()\n",
    "        if self.encoding == 'onehot-dense':\n",
    "            return out.toarray()\n",
    "        else:\n",
    "            return out"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's build our preprocessing pipelines. We will reuse the `DataframeSelector` we built in the previous chapter to select specific attributes from the `DataFrame`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.base import BaseEstimator, TransformerMixin\n",
    "\n",
    "# A class to select numerical or categorical columns \n",
    "# since Scikit-Learn doesn't handle DataFrames yet\n",
    "class DataFrameSelector(BaseEstimator, TransformerMixin):\n",
    "    def __init__(self, attribute_names):\n",
    "        self.attribute_names = attribute_names\n",
    "    def fit(self, X, y=None):\n",
    "        return self\n",
    "    def transform(self, X):\n",
    "        return X[self.attribute_names]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's build the pipeline for the numerical attributes:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.preprocessing import Imputer\n",
    "\n",
    "imputer = Imputer(strategy=\"median\")\n",
    "\n",
    "num_pipeline = Pipeline([\n",
    "        (\"select_numeric\", DataFrameSelector([\"Age\", \"SibSp\", \"Parch\", \"Fare\"])),\n",
    "        (\"imputer\", Imputer(strategy=\"median\")),\n",
    "    ])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 22.    ,   1.    ,   0.    ,   7.25  ],\n",
       "       [ 38.    ,   1.    ,   0.    ,  71.2833],\n",
       "       [ 26.    ,   0.    ,   0.    ,   7.925 ],\n",
       "       ..., \n",
       "       [ 28.    ,   1.    ,   2.    ,  23.45  ],\n",
       "       [ 26.    ,   0.    ,   0.    ,  30.    ],\n",
       "       [ 32.    ,   0.    ,   0.    ,   7.75  ]])"
      ]
     },
     "execution_count": 113,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "num_pipeline.fit_transform(train_data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We will also need an imputer for the string categorical columns (the regular `Imputer` does not work on those):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Inspired from stackoverflow.com/questions/25239958\n",
    "class MostFrequentImputer(BaseEstimator, TransformerMixin):\n",
    "    def fit(self, X, y=None):\n",
    "        self.most_frequent = pd.Series([X[c].value_counts().index[0] for c in X],\n",
    "                                       index=X.columns)\n",
    "        return self\n",
    "    def transform(self, X, y=None):\n",
    "        return X.fillna(self.most_frequent)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we can build the pipeline for the categorical attributes:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "cat_pipeline = Pipeline([\n",
    "        (\"select_cat\", DataFrameSelector([\"Pclass\", \"Sex\", \"Embarked\"])),\n",
    "        (\"imputer\", MostFrequentImputer()),\n",
    "        (\"cat_encoder\", CategoricalEncoder(encoding='onehot-dense')),\n",
    "    ])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.,  0.,  1., ...,  0.,  0.,  1.],\n",
       "       [ 1.,  0.,  0., ...,  1.,  0.,  0.],\n",
       "       [ 0.,  0.,  1., ...,  0.,  0.,  1.],\n",
       "       ..., \n",
       "       [ 0.,  0.,  1., ...,  0.,  0.,  1.],\n",
       "       [ 1.,  0.,  0., ...,  1.,  0.,  0.],\n",
       "       [ 0.,  0.,  1., ...,  0.,  1.,  0.]])"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cat_pipeline.fit_transform(train_data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, let's join the numerical and categorical pipelines:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.pipeline import FeatureUnion\n",
    "preprocess_pipeline = FeatureUnion(transformer_list=[\n",
    "        (\"num_pipeline\", num_pipeline),\n",
    "        (\"cat_pipeline\", cat_pipeline),\n",
    "    ])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Cool! Now we have a nice preprocessing pipeline that takes the raw data and outputs numerical input features that we can feed to any Machine Learning model we want."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 22.,   1.,   0., ...,   0.,   0.,   1.],\n",
       "       [ 38.,   1.,   0., ...,   1.,   0.,   0.],\n",
       "       [ 26.,   0.,   0., ...,   0.,   0.,   1.],\n",
       "       ..., \n",
       "       [ 28.,   1.,   2., ...,   0.,   0.,   1.],\n",
       "       [ 26.,   0.,   0., ...,   1.,   0.,   0.],\n",
       "       [ 32.,   0.,   0., ...,   0.,   1.,   0.]])"
      ]
     },
     "execution_count": 118,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train = preprocess_pipeline.fit_transform(train_data)\n",
    "X_train"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's not forget to get the labels:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_train = train_data[\"Survived\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We are now ready to train a classifier. Let's start with an `SVC`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,\n",
       "  decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',\n",
       "  max_iter=-1, probability=False, random_state=None, shrinking=True,\n",
       "  tol=0.001, verbose=False)"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.svm import SVC\n",
    "\n",
    "svm_clf = SVC()\n",
    "svm_clf.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Great, our model is trained, let's use it to make predictions on the test set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X_test = preprocess_pipeline.transform(test_data)\n",
    "y_pred = svm_clf.predict(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And now we could just build a CSV file with these predictions (respecting the format excepted by Kaggle), then upload it and hope for the best. But wait! We can do better than hope. Why don't we use cross-validation to have an idea of how good our model is?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.73652508228350921"
      ]
     },
     "execution_count": 122,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score\n",
    "\n",
    "scores = cross_val_score(svm_clf, X_train, y_train, cv=10)\n",
    "scores.mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Okay, over 73% accuracy, clearly better than random chance, but it's not a great score. Looking at the [leaderboard](https://www.kaggle.com/c/titanic/leaderboard) for the Titanic competition on Kaggle, you can see that you need to reach above 80% accuracy to be within the top 10% Kagglers. Some reached 100%, but since you can easily find the [list of victims](https://www.encyclopedia-titanica.org/titanic-victims/) of the Titanic, it seems likely that there was little Machine Learning involved in their performance! ;-) So let's try to build a model that reaches 80% accuracy."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's try a `RandomForestClassifier`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8115690614005221"
      ]
     },
     "execution_count": 123,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "forest_clf = RandomForestClassifier(random_state=42)\n",
    "scores = cross_val_score(forest_clf, X_train, y_train, cv=10)\n",
    "scores.mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "That's much better!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To improve this result further, you could:\n",
    "* Compare many more models and tune hyperparameters using cross validation and grid search,\n",
    "* Do more feature engineering, for example:\n",
    "  * replace **SibSp** and **Parch** with their sum,\n",
    "  * try to identify parts of names that correlate well with the **Survived** attribute (e.g. if the name contains \"Countess\", then survival seems more likely),\n",
    "* try to convert numerical attributes to categorical attributes: for example, different age groups had very different survival rates (see below), so it may help to create an age bucket category and use it instead of the age. Similarly, it may be useful to have a special category for people traveling alone since only 30% of them survived (see below)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AgeBucket</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0.0</th>\n",
       "      <td>0.576923</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15.0</th>\n",
       "      <td>0.362745</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30.0</th>\n",
       "      <td>0.423256</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45.0</th>\n",
       "      <td>0.404494</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>60.0</th>\n",
       "      <td>0.240000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75.0</th>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           Survived\n",
       "AgeBucket          \n",
       "0.0        0.576923\n",
       "15.0       0.362745\n",
       "30.0       0.423256\n",
       "45.0       0.404494\n",
       "60.0       0.240000\n",
       "75.0       1.000000"
      ]
     },
     "execution_count": 124,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data[\"AgeBucket\"] = train_data[\"Age\"] // 15 * 15\n",
    "train_data[[\"AgeBucket\", \"Survived\"]].groupby(['AgeBucket']).mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>RelativesOnboard</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.303538</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.552795</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.578431</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.724138</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.200000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.136364</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.333333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                  Survived\n",
       "RelativesOnboard          \n",
       "0                 0.303538\n",
       "1                 0.552795\n",
       "2                 0.578431\n",
       "3                 0.724138\n",
       "4                 0.200000\n",
       "5                 0.136364\n",
       "6                 0.333333\n",
       "7                 0.000000\n",
       "10                0.000000"
      ]
     },
     "execution_count": 125,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data[\"RelativesOnboard\"] = train_data[\"SibSp\"] + train_data[\"Parch\"]\n",
    "train_data[[\"RelativesOnboard\", \"Survived\"]].groupby(['RelativesOnboard']).mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. Spam classifier"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, let's fetch the data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import os\n",
    "import tarfile\n",
    "from six.moves import urllib\n",
    "\n",
    "DOWNLOAD_ROOT = \"http://spamassassin.apache.org/old/publiccorpus/\"\n",
    "HAM_URL = DOWNLOAD_ROOT + \"20030228_easy_ham.tar.bz2\"\n",
    "SPAM_URL = DOWNLOAD_ROOT + \"20030228_spam.tar.bz2\"\n",
    "SPAM_PATH = os.path.join(\"datasets\", \"spam\")\n",
    "\n",
    "def fetch_spam_data(spam_url=SPAM_URL, spam_path=SPAM_PATH):\n",
    "    if not os.path.isdir(spam_path):\n",
    "        os.makedirs(spam_path)\n",
    "    for filename, url in ((\"ham.tar.bz2\", HAM_URL), (\"spam.tar.bz2\", SPAM_URL)):\n",
    "        path = os.path.join(spam_path, filename)\n",
    "        if not os.path.isfile(path):\n",
    "            urllib.request.urlretrieve(url, path)\n",
    "        tar_bz2_file = tarfile.open(path)\n",
    "        tar_bz2_file.extractall(path=SPAM_PATH)\n",
    "        tar_bz2_file.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "fetch_spam_data()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, let's load all the emails:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "HAM_DIR = os.path.join(SPAM_PATH, \"easy_ham\")\n",
    "SPAM_DIR = os.path.join(SPAM_PATH, \"spam\")\n",
    "ham_filenames = [name for name in sorted(os.listdir(HAM_DIR)) if len(name) > 20]\n",
    "spam_filenames = [name for name in sorted(os.listdir(SPAM_DIR)) if len(name) > 20]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2500"
      ]
     },
     "execution_count": 129,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(ham_filenames)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "500"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(spam_filenames)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can use Python's `email` module to parse these emails (this handles headers, encoding, and so on):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import email\n",
    "import email.policy\n",
    "\n",
    "def load_email(is_spam, filename, spam_path=SPAM_PATH):\n",
    "    directory = \"spam\" if is_spam else \"easy_ham\"\n",
    "    with open(os.path.join(spam_path, directory, filename), \"rb\") as f:\n",
    "        return email.parser.BytesParser(policy=email.policy.default).parse(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "ham_emails = [load_email(is_spam=False, filename=name) for name in ham_filenames]\n",
    "spam_emails = [load_email(is_spam=True, filename=name) for name in spam_filenames]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's look at one example of ham and one example of spam, to get a feel of what the data looks like:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Martin A posted:\n",
      "Tassos Papadopoulos, the Greek sculptor behind the plan, judged that the\n",
      " limestone of Mount Kerdylio, 70 miles east of Salonika and not far from the\n",
      " Mount Athos monastic community, was ideal for the patriotic sculpture. \n",
      " \n",
      " As well as Alexander's granite features, 240 ft high and 170 ft wide, a\n",
      " museum, a restored amphitheatre and car park for admiring crowds are\n",
      "planned\n",
      "---------------------\n",
      "So is this mountain limestone or granite?\n",
      "If it's limestone, it'll weather pretty fast.\n",
      "\n",
      "------------------------ Yahoo! Groups Sponsor ---------------------~-->\n",
      "4 DVDs Free +s&p Join Now\n",
      "http://us.click.yahoo.com/pt6YBB/NXiEAA/mG3HAA/7gSolB/TM\n",
      "---------------------------------------------------------------------~->\n",
      "\n",
      "To unsubscribe from this group, send an email to:\n",
      "forteana-unsubscribe@egroups.com\n",
      "\n",
      " \n",
      "\n",
      "Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/\n"
     ]
    }
   ],
   "source": [
    "print(ham_emails[1].get_content().strip())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help wanted.  We are a 14 year old fortune 500 company, that is\n",
      "growing at a tremendous rate.  We are looking for individuals who\n",
      "want to work from home.\n",
      "\n",
      "This is an opportunity to make an excellent income.  No experience\n",
      "is required.  We will train you.\n",
      "\n",
      "So if you are looking to be employed from home with a career that has\n",
      "vast opportunities, then go:\n",
      "\n",
      "http://www.basetel.com/wealthnow\n",
      "\n",
      "We are looking for energetic and self motivated people.  If that is you\n",
      "than click on the link and fill out the form, and one of our\n",
      "employement specialist will contact you.\n",
      "\n",
      "To be removed from our link simple go to:\n",
      "\n",
      "http://www.basetel.com/remove.html\n",
      "\n",
      "\n",
      "4139vOLW7-758DoDY1425FRhM1-764SMFc8513fCsLl40\n"
     ]
    }
   ],
   "source": [
    "print(spam_emails[6].get_content().strip())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Some emails are actually multipart, with images and attachments (which can have their own attachments). Let's look at the various types of structures we have:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def get_email_structure(email):\n",
    "    if isinstance(email, str):\n",
    "        return email\n",
    "    payload = email.get_payload()\n",
    "    if isinstance(payload, list):\n",
    "        return \"multipart({})\".format(\", \".join([\n",
    "            get_email_structure(sub_email)\n",
    "            for sub_email in payload\n",
    "        ]))\n",
    "    else:\n",
    "        return email.get_content_type()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from collections import Counter\n",
    "\n",
    "def structures_counter(emails):\n",
    "    structures = Counter()\n",
    "    for email in emails:\n",
    "        structure = get_email_structure(email)\n",
    "        structures[structure] += 1\n",
    "    return structures"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('text/plain', 2408),\n",
       " ('multipart(text/plain, application/pgp-signature)', 66),\n",
       " ('multipart(text/plain, text/html)', 8),\n",
       " ('multipart(text/plain, text/plain)', 4),\n",
       " ('multipart(text/plain)', 3),\n",
       " ('multipart(text/plain, application/octet-stream)', 2),\n",
       " ('multipart(text/plain, text/enriched)', 1),\n",
       " ('multipart(text/plain, video/mng)', 1),\n",
       " ('multipart(text/plain, application/x-pkcs7-signature)', 1),\n",
       " ('multipart(text/plain, multipart(text/plain))', 1),\n",
       " ('multipart(multipart(text/plain, text/plain, text/plain), application/pgp-signature)',\n",
       "  1),\n",
       " ('multipart(text/plain, application/ms-tnef, text/plain)', 1),\n",
       " ('multipart(text/plain, application/x-java-applet)', 1),\n",
       " ('multipart(text/plain, multipart(text/plain, text/plain), text/rfc822-headers)',\n",
       "  1),\n",
       " ('multipart(text/plain, multipart(text/plain, text/plain), multipart(multipart(text/plain, application/x-pkcs7-signature)))',\n",
       "  1)]"
      ]
     },
     "execution_count": 137,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "structures_counter(ham_emails).most_common()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('text/plain', 218),\n",
       " ('text/html', 183),\n",
       " ('multipart(text/plain, text/html)', 45),\n",
       " ('multipart(text/html)', 20),\n",
       " ('multipart(text/plain)', 19),\n",
       " ('multipart(multipart(text/html))', 5),\n",
       " ('multipart(text/plain, image/jpeg)', 3),\n",
       " ('multipart(text/html, application/octet-stream)', 2),\n",
       " ('multipart(multipart(text/plain, text/html), image/gif)', 1),\n",
       " ('multipart(multipart(text/html), application/octet-stream, image/jpeg)', 1),\n",
       " ('multipart/alternative', 1),\n",
       " ('multipart(text/html, text/plain)', 1),\n",
       " ('multipart(text/plain, application/octet-stream)', 1)]"
      ]
     },
     "execution_count": 138,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "structures_counter(spam_emails).most_common()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It seems that the ham emails are more often plain text, while spam has quite a lot of HTML. Moreover, quite a few ham emails are signed using PGP, while no spam is. In short, it seems that the email structure is useful information to have."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's take a look at the email headers:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Return-Path : <12a1mailbot1@web.de>\n",
      "Delivered-To : zzzz@localhost.spamassassin.taint.org\n",
      "Received : from localhost (localhost [127.0.0.1])\tby phobos.labs.spamassassin.taint.org (Postfix) with ESMTP id 136B943C32\tfor <zzzz@localhost>; Thu, 22 Aug 2002 08:17:21 -0400 (EDT)\n",
      "Received : from mail.webnote.net [193.120.211.219]\tby localhost with POP3 (fetchmail-5.9.0)\tfor zzzz@localhost (single-drop); Thu, 22 Aug 2002 13:17:21 +0100 (IST)\n",
      "Received : from dd_it7 ([210.97.77.167])\tby webnote.net (8.9.3/8.9.3) with ESMTP id NAA04623\tfor <zzzz@spamassassin.taint.org>; Thu, 22 Aug 2002 13:09:41 +0100\n",
      "From : 12a1mailbot1@web.de\n",
      "Received : from r-smtp.korea.com - 203.122.2.197 by dd_it7  with Microsoft SMTPSVC(5.5.1775.675.6);\t Sat, 24 Aug 2002 09:42:10 +0900\n",
      "To : dcek1a1@netsgo.com\n",
      "Subject : Life Insurance - Why Pay More?\n",
      "Date : Wed, 21 Aug 2002 20:31:57 -1600\n",
      "MIME-Version : 1.0\n",
      "Message-ID : <0103c1042001882DD_IT7@dd_it7>\n",
      "Content-Type : text/html; charset=\"iso-8859-1\"\n",
      "Content-Transfer-Encoding : quoted-printable\n"
     ]
    }
   ],
   "source": [
    "for header, value in spam_emails[0].items():\n",
    "    print(header,\":\",value)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There's probably a lot of useful information in there, such as the sender's email address (12a1mailbot1@web.de looks fishy), but we will just focus on the `Subject` header:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Life Insurance - Why Pay More?'"
      ]
     },
     "execution_count": 140,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "spam_emails[0][\"Subject\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Okay, before we learn too much about the data, let's not forget to split it into a training set and a test set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "X = np.array(ham_emails + spam_emails)\n",
    "y = np.array([0] * len(ham_emails) + [1] * len(spam_emails))\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Okay, let's start writing the preprocessing functions. First, we will need a function to convert HTML to plain text. Arguably the best way to do this would be to use the great [BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/) library, but I would like to avoid adding another dependency to this project, so let's hack a quick & dirty solution using regular expressions (at the risk of [un̨ho͞ly radiańcé destro҉ying all enli̍̈́̂̈́ghtenment](https://stackoverflow.com/a/1732454/38626)). The following function first drops the `<head>` section, then converts all `<a>` tags to the word HYPERLINK, then it gets rid of all HTML tags, leaving only the plain text. For readability, it also replaces multiple newlines with single newlines, and finally it unescapes html entities (such as `&gt;` or `&nbsp;`):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import re\n",
    "from html import unescape\n",
    "\n",
    "def html_to_plain_text(html):\n",
    "    text = re.sub('<head.*?>.*?</head>', '', html, flags=re.M | re.S | re.I)\n",
    "    text = re.sub('<a\\s.*?>', ' HYPERLINK ', text, flags=re.M | re.S | re.I)\n",
    "    text = re.sub('<.*?>', '', text, flags=re.M | re.S)\n",
    "    text = re.sub(r'(\\s*\\n)+', '\\n', text, flags=re.M | re.S)\n",
    "    return unescape(text)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's see if it works. This is HTML spam:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<HTML><HEAD><TITLE></TITLE><META http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1252\"><STYLE>A:link {TEX-DECORATION: none}A:active {TEXT-DECORATION: none}A:visited {TEXT-DECORATION: none}A:hover {COLOR: #0033ff; TEXT-DECORATION: underline}</STYLE><META content=\"MSHTML 6.00.2713.1100\" name=\"GENERATOR\"></HEAD>\n",
      "<BODY text=\"#000000\" vLink=\"#0033ff\" link=\"#0033ff\" bgColor=\"#CCCC99\"><TABLE borderColor=\"#660000\" cellSpacing=\"0\" cellPadding=\"0\" border=\"0\" width=\"100%\"><TR><TD bgColor=\"#CCCC99\" valign=\"top\" colspan=\"2\" height=\"27\">\n",
      "<font size=\"6\" face=\"Arial, Helvetica, sans-serif\" color=\"#660000\">\n",
      "<b>OTC</b></font></TD></TR><TR><TD height=\"2\" bgcolor=\"#6a694f\">\n",
      "<font size=\"5\" face=\"Times New Roman, Times, serif\" color=\"#FFFFFF\">\n",
      "<b>&nbsp;Newsletter</b></font></TD><TD height=\"2\" bgcolor=\"#6a694f\"><div align=\"right\"><font color=\"#FFFFFF\">\n",
      "<b>Discover Tomorrow's Winners&nbsp;</b></font></div></TD></TR><TR><TD height=\"25\" colspan=\"2\" bgcolor=\"#CCCC99\"><table width=\"100%\" border=\"0\"  ...\n"
     ]
    }
   ],
   "source": [
    "html_spam_emails = [email for email in X_train[y_train==1]\n",
    "                    if get_email_structure(email) == \"text/html\"]\n",
    "sample_html_spam = html_spam_emails[7]\n",
    "print(sample_html_spam.get_content().strip()[:1000], \"...\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And this is the resulting plain text:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "OTC\n",
      " Newsletter\n",
      "Discover Tomorrow's Winners \n",
      "For Immediate Release\n",
      "Cal-Bay (Stock Symbol: CBYI)\n",
      "Watch for analyst \"Strong Buy Recommendations\" and several advisory newsletters picking CBYI.  CBYI has filed to be traded on the OTCBB, share prices historically INCREASE when companies get listed on this larger trading exchange. CBYI is trading around 25 cents and should skyrocket to $2.66 - $3.25 a share in the near future.\n",
      "Put CBYI on your watch list, acquire a position TODAY.\n",
      "REASONS TO INVEST IN CBYI\n",
      "A profitable company and is on track to beat ALL earnings estimates!\n",
      "One of the FASTEST growing distributors in environmental & safety equipment instruments.\n",
      "Excellent management team, several EXCLUSIVE contracts.  IMPRESSIVE client list including the U.S. Air Force, Anheuser-Busch, Chevron Refining and Mitsubishi Heavy Industries, GE-Energy & Environmental Research.\n",
      "RAPIDLY GROWING INDUSTRY\n",
      "Industry revenues exceed $900 million, estimates indicate that there could be as much as $25 billi ...\n"
     ]
    }
   ],
   "source": [
    "print(html_to_plain_text(sample_html_spam.get_content())[:1000], \"...\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Great! Now let's write a function that takes an email as input and returns its content as plain text, whatever its format is:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def email_to_text(email):\n",
    "    html = None\n",
    "    for part in email.walk():\n",
    "        ctype = part.get_content_type()\n",
    "        if not ctype in (\"text/plain\", \"text/html\"):\n",
    "            continue\n",
    "        try:\n",
    "            content = part.get_content()\n",
    "        except: # in case of encoding issues\n",
    "            content = str(part.get_payload())\n",
    "        if ctype == \"text/plain\":\n",
    "            return content\n",
    "        else:\n",
    "            html = content\n",
    "    if html:\n",
    "        return html_to_plain_text(html)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "OTC\n",
      " Newsletter\n",
      "Discover Tomorrow's Winners \n",
      "For Immediate Release\n",
      "Cal-Bay (Stock Symbol: CBYI)\n",
      "Wat ...\n"
     ]
    }
   ],
   "source": [
    "print(email_to_text(sample_html_spam)[:100], \"...\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's throw in some stemming! For this to work, you need to install the Natural Language Toolkit ([NLTK](http://www.nltk.org/)). It's as simple as running the following command (don't forget to activate your virtualenv first; if you don't have one, you will likely need administrator rights, or use the `--user` option):\n",
    "\n",
    "`$ pip install nltk`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Computations => comput\n",
      "Computation => comput\n",
      "Computing => comput\n",
      "Computed => comput\n",
      "Compute => comput\n",
      "Compulsive => compuls\n"
     ]
    }
   ],
   "source": [
    "try:\n",
    "    import nltk\n",
    "\n",
    "    stemmer = nltk.PorterStemmer()\n",
    "    for word in (\"Computations\", \"Computation\", \"Computing\", \"Computed\", \"Compute\", \"Compulsive\"):\n",
    "        print(word, \"=>\", stemmer.stem(word))\n",
    "except ImportError:\n",
    "    print(\"Error: stemming requires the NLTK module.\")\n",
    "    stemmer = None"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We will also need a way to replace URLs with the word \"URL\". For this, we could use hard core [regular expressions](https://mathiasbynens.be/demo/url-regex) but we will just use the [urlextract](https://github.com/lipoja/URLExtract) library. You can install it with the following command (don't forget to activate your virtualenv first; if you don't have one, you will likely need administrator rights, or use the `--user` option):\n",
    "\n",
    "`$ pip install urlextract`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['github.com', 'https://youtu.be/7Pq-S557XQU?t=3m32s']\n"
     ]
    }
   ],
   "source": [
    "try:\n",
    "    import urlextract # may require an Internet connection to download root domain names\n",
    "    \n",
    "    url_extractor = urlextract.URLExtract()\n",
    "    print(url_extractor.find_urls(\"Will it detect github.com and https://youtu.be/7Pq-S557XQU?t=3m32s\"))\n",
    "except ImportError:\n",
    "    print(\"Error: replacing URLs requires the urlextract module.\")\n",
    "    url_extractor = None"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We are ready to put all this together into a transformer that we will use to convert emails to word counters. Note that we split sentences into words using Python's `split()` method, which uses whitespaces for word boundaries. This works for many written languages, but not all. For example, Chinese and Japanese scripts generally don't use spaces between words, and Vietnamese often uses spaces even between syllables. It's okay in this exercise, because the dataset is (mostly) in English."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.base import BaseEstimator, TransformerMixin\n",
    "\n",
    "class EmailToWordCounterTransformer(BaseEstimator, TransformerMixin):\n",
    "    def __init__(self, strip_headers=True, lower_case=True, remove_punctuation=True,\n",
    "                 replace_urls=True, replace_numbers=True, stemming=True):\n",
    "        self.strip_headers = strip_headers\n",
    "        self.lower_case = lower_case\n",
    "        self.remove_punctuation = remove_punctuation\n",
    "        self.replace_urls = replace_urls\n",
    "        self.replace_numbers = replace_numbers\n",
    "        self.stemming = stemming\n",
    "    def fit(self, X, y=None):\n",
    "        return self\n",
    "    def transform(self, X, y=None):\n",
    "        X_transformed = []\n",
    "        for email in X:\n",
    "            text = email_to_text(email) or \"\"\n",
    "            if self.lower_case:\n",
    "                text = text.lower()\n",
    "            if self.replace_urls and url_extractor is not None:\n",
    "                urls = list(set(url_extractor.find_urls(text)))\n",
    "                urls.sort(key=lambda url: len(url), reverse=True)\n",
    "                for url in urls:\n",
    "                    text = text.replace(url, \" URL \")\n",
    "            if self.replace_numbers:\n",
    "                text = re.sub(r'\\d+(?:\\.\\d*(?:[eE]\\d+))?', 'NUMBER', text)\n",
    "            if self.remove_punctuation:\n",
    "                text = re.sub(r'\\W+', ' ', text, flags=re.M)\n",
    "            word_counts = Counter(text.split())\n",
    "            if self.stemming and stemmer is not None:\n",
    "                stemmed_word_counts = Counter()\n",
    "                for word, count in word_counts.items():\n",
    "                    stemmed_word = stemmer.stem(word)\n",
    "                    stemmed_word_counts[stemmed_word] += count\n",
    "                word_counts = stemmed_word_counts\n",
    "            X_transformed.append(word_counts)\n",
    "        return np.array(X_transformed)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's try this transformer on a few emails:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ Counter({'wrote': 1, 'r': 1, 'chuck': 1, 'stuff': 1, 'murcko': 1, 'yawn': 1}),\n",
       "       Counter({'the': 11, 'of': 9, 'and': 8, 'christian': 3, 'all': 3, 'by': 3, 'to': 3, 'superstit': 2, 'been': 2, 'teach': 2, 'jesu': 2, 'on': 2, 'have': 2, 'one': 2, 'rogueri': 2, 'i': 2, 'jefferson': 2, 'half': 2, 'ha': 2, 'e': 1, 'effect': 1, 'mytholog': 1, 'again': 1, 'what': 1, 'most': 1, 'william': 1, 'perpetr': 1, 'do': 1, 'world': 1, 'women': 1, 'first': 1, 'thi': 1, 'redeem': 1, 'url': 1, 'letter': 1, 'ever': 1, 'particular': 1, 'pervert': 1, 'interest': 1, 'histor': 1, 'sinc': 1, 'found': 1, 'find': 1, 'becom': 1, 'hypocrit': 1, 'larg': 1, 'featur': 1, 'some': 1, 'great': 1, 'known': 1, 'fabl': 1, 'fine': 1, 'examin': 1, 'children': 1, 'imprison': 1, 'other': 1, 'introduct': 1, 'john': 1, 'make': 1, 'led': 1, 'absurd': 1, 'quot': 1, 'coercion': 1, 'american': 1, 'million': 1, 'they': 1, 'earth': 1, 'burnt': 1, 'not': 1, 'paul': 1, 'short': 1, 'remsburg': 1, 'man': 1, 'support': 1, 'alik': 1, 'were': 1, 'word': 1, 'shone': 1, 'our': 1, 'thoma': 1, 'corrupt': 1, 'dupe': 1, 'that': 1, 'system': 1, 'a': 1, 'band': 1, 'upon': 1, 'innoc': 1, 'error': 1, 'men': 1, 'are': 1, 'fool': 1, 'tortur': 1, 'six': 1, 'import': 1, 'over': 1, 'untruth': 1, 'in': 1}),\n",
       "       Counter({'url': 5, 's': 3, 'group': 3, 'to': 3, 'martin': 2, 'we': 2, 'forteana': 2, 'is': 2, 'and': 2, 'an': 2, 'unsubscrib': 2, 'yahoo': 2, 'in': 2, 'join': 1, 'career': 1, 'hamza': 1, 'yemen': 1, 'email': 1, 'muslim': 1, 'should': 1, 'rather': 1, 'wrote': 1, 'more': 1, 'thi': 1, 'includ': 1, 'belief': 1, 'factual': 1, 'altern': 1, 'know': 1, 'html': 1, 'rundown': 1, 'hi': 1, 'use': 1, 'send': 1, 'dvd': 1, 'free': 1, 'all': 1, 'for': 1, 'non': 1, 'that': 1, 'your': 1, 'on': 1, 'sponsor': 1, 'y': 1, 'now': 1, 'adamson': 1, 'p': 1, 'from': 1, 'of': 1, 'number': 1, 'rob': 1, 'murder': 1, 'memri': 1, 'outright': 1, 'how': 1, 'subject': 1, 'be': 1, 'unbias': 1, 'base': 1, 't': 1, 'don': 1})], dtype=object)"
      ]
     },
     "execution_count": 150,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_few = X_train[:3]\n",
    "X_few_wordcounts = EmailToWordCounterTransformer().fit_transform(X_few)\n",
    "X_few_wordcounts"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This looks about right!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we have the word counts, and we need to convert them to vectors. For this, we will build another transformer whose `fit()` method will build the vocabulary (an ordered list of the most common words) and whose `transform()` method will use the vocabulary to convert word counts to vectors. The output is a sparse matrix."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from scipy.sparse import csr_matrix\n",
    "\n",
    "class WordCounterToVectorTransformer(BaseEstimator, TransformerMixin):\n",
    "    def __init__(self, vocabulary_size=1000):\n",
    "        self.vocabulary_size = vocabulary_size\n",
    "    def fit(self, X, y=None):\n",
    "        total_count = Counter()\n",
    "        for word_count in X:\n",
    "            for word, count in word_count.items():\n",
    "                total_count[word] += min(count, 10)\n",
    "        most_common = total_count.most_common()[:self.vocabulary_size]\n",
    "        self.most_common_ = most_common\n",
    "        self.vocabulary_ = {word: index + 1 for index, (word, count) in enumerate(most_common)}\n",
    "        return self\n",
    "    def transform(self, X, y=None):\n",
    "        rows = []\n",
    "        cols = []\n",
    "        data = []\n",
    "        for row, word_count in enumerate(X):\n",
    "            for word, count in word_count.items():\n",
    "                rows.append(row)\n",
    "                cols.append(self.vocabulary_.get(word, 0))\n",
    "                data.append(count)\n",
    "        return csr_matrix((data, (rows, cols)), shape=(len(X), self.vocabulary_size + 1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<3x11 sparse matrix of type '<class 'numpy.int64'>'\n",
       "\twith 19 stored elements in Compressed Sparse Row format>"
      ]
     },
     "execution_count": 152,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vocab_transformer = WordCounterToVectorTransformer(vocabulary_size=10)\n",
    "X_few_vectors = vocab_transformer.fit_transform(X_few_wordcounts)\n",
    "X_few_vectors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],\n",
       "       [100,   9,   8,  11,   1,   3,   3,   3,   2,   0,   3],\n",
       "       [ 64,   1,   2,   0,   5,   3,   1,   0,   1,   3,   0]], dtype=int64)"
      ]
     },
     "execution_count": 153,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_few_vectors.toarray()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "What does this matrix mean? Well, the 65 in the third row, first column, means that the third email contains 65 words that are not part of the vocabulary. The 0 next to it means that the first word in the vocabulary is not present in this email. The 1 next to it means that the second word is present once, and so on. You can look at the vocabulary to know which words we are talking about. The first word is \"the\", the second word is \"of\", etc."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'all': 6,\n",
       " 'and': 2,\n",
       " 'by': 10,\n",
       " 'christian': 7,\n",
       " 'of': 1,\n",
       " 'on': 8,\n",
       " 's': 9,\n",
       " 'the': 3,\n",
       " 'to': 5,\n",
       " 'url': 4}"
      ]
     },
     "execution_count": 154,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vocab_transformer.vocabulary_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We are now ready to train our first spam classifier! Let's transform the whole dataset:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.pipeline import Pipeline\n",
    "\n",
    "preprocess_pipeline = Pipeline([\n",
    "    (\"email_to_wordcount\", EmailToWordCounterTransformer()),\n",
    "    (\"wordcount_to_vector\", WordCounterToVectorTransformer()),\n",
    "])\n",
    "\n",
    "X_train_transformed = preprocess_pipeline.fit_transform(X_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  ................................................................\n",
      "[CV] .................................. , score=0.98375, total=   0.0s\n",
      "[CV]  ................................................................\n",
      "[CV] .................................... , score=0.985, total=   0.1s\n",
      "[CV]  ................................................................\n",
      "[CV] ................................... , score=0.9925, total=   0.1s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    0.0s remaining:    0.0s\n",
      "[Parallel(n_jobs=1)]: Done   2 out of   2 | elapsed:    0.1s remaining:    0.0s\n",
      "[Parallel(n_jobs=1)]: Done   3 out of   3 | elapsed:    0.2s finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.98708333333333342"
      ]
     },
     "execution_count": 156,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import cross_val_score\n",
    "\n",
    "log_clf = LogisticRegression()\n",
    "score = cross_val_score(log_clf, X_train_transformed, y_train, cv=3, verbose=3)\n",
    "score.mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Over 98.7%, not bad for a first try! :) However, remember that we are using the \"easy\" dataset. You can try with the harder datasets, the results won't be so amazing. You would have to try multiple models, select the best ones and fine-tune them using cross-validation, and so on.\n",
    "\n",
    "But you get the picture, so let's stop now, and just print out the precision/recall we get on the test set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Precision: 95.00%\n",
      "Recall: 98.00%\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "X_test_transformed = preprocess_pipeline.transform(X_test)\n",
    "\n",
    "log_clf = LogisticRegression()\n",
    "log_clf.fit(X_train_transformed, y_train)\n",
    "\n",
    "y_pred = log_clf.predict(X_test_transformed)\n",
    "\n",
    "print(\"Precision: {:.2f}%\".format(100 * precision_score(y_test, y_pred)))\n",
    "print(\"Recall: {:.2f}%\".format(100 * recall_score(y_test, y_pred)))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  },
  "nav_menu": {},
  "toc": {
   "navigate_menu": true,
   "number_sections": true,
   "sideBar": true,
   "threshold": 6,
   "toc_cell": false,
   "toc_section_display": "block",
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
